2010-05-28 176 views
0

我有一个问题。 这是我的代码。 当我尝试使用IBAction SavePosition“arrayPosition”不更新。 否则,如果我在“SavePosition”中初始化“arrayPosition”,则该值将存储在数组中。 为什么这个异常?初始化问题

#import <UIKit/UIKit.h> 

@interface AccelerometroViewController : UIViewController <UIAccelerometerDelegate, UITextFieldDelegate, UIAlertViewDelegate>{ 

    //.....  

    NSMutableArray *arrayPosizioni; 
    NSMutableArray *arrayPosizioniCorrenti; 

    NSString *nomePosizioneCorrente; 

} 

-(IBAction)salvaPosizione; 


//... 
@property (nonatomic, assign) NSMutableArray  *arrayPosizioni; 
@property (nonatomic, assign) NSMutableArray  *arrayPosizioniCorrenti; 

@property (nonatomic, assign) NSString  *nomePosizioneCorrente; 

@end 



#import "AccelerometroViewController.h" 
#import "Position.h" 

@implementation AccelerometroViewController 



float actualX; 
float actualY; 
float actualZ; 


@synthesize arrayPosition; 
@synthesize arrayCurrentPosition; 

@synthesize nameCurrentPosition; 

    -(id)init { 
     self = [super init]; 
     if (self != nil) { 
      arrayPosition = [[NSMutableArray alloc]init]; 
      arrayCurrentPosition = [[NSMutableArray alloc]init]; 
      nameCurrentPosition = [NSString stringWithFormat:@"noPosition"]; 
      actualX = 0; 
      actualY = 0; 
      actualZ = 0; 
     } 
     return self; 
    } 


    -(void)updateTextView:(NSString*)nomePosizione 
    { 
     NSString *string = [NSString stringWithFormat:@"%@", nameCurrentPosition]; 
     textEvent.text = [textEvent.text  stringByAppendingString:@"\n"]; 
     textEvent.text = [textEvent.text  stringByAppendingString:string]; 
    } 


    -(IBAction)savePosition{ 

     Posizione *newPosition; 
     newPosition = [[Position alloc]init]; 

     if([newPosition  setValue:(NSString*)fieldNomePosizione.text:(float)actualX:(float)actualY:(float)actualZ]){ 
     //setValue is a method of Position. I'm sure that this method is correct 
      UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Salvataggio Posizione" message:@"Posizione salvata con successo" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:nil]; 
      [alert show]; 
      [alert release];   
      [arrayPosition addObject:newPosition]; 
     } 
     else{ 
      UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Salvataggio osizione" message:@"Errore nel salvataggio" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:nil]; 
      [alert show]; 
      [alert release]; 
     } 
    } 
+0

嗨。你在savePosition中有内存泄漏!您需要在最后释放newPosition(或在您分配/初始化时自动释放它) – deanWombourne 2010-05-28 13:16:02

回答

4

怎么回事?

我敢打赌,你正在xib文件中创建你的视图控制器?

如果你设置你的init()方法中的断点上线

arrayPosition = [[NSMutableArray alloc]init]; 

我敢打赌,它永远不会运行。这意味着,当你站上罚球线

[arrayPosition addObject:newPosition]; 

arrayPosition仍然nil所以什么也不会发生。

如何解决?

如果您正在初始化一个UIViewController,它可以在initWithNibName:bundle中调用:如果您已经在代码或initWithCoder中创建它:如果它是在xib文件中创建的。

你需要做这样的事情:

- (void) initialise { 
    arrayPosition = [[NSMutableArray alloc] init]; 
    arrayCurrentPosition = [[NSMutableArray alloc] init]; 
    nameCurrentPosition = @"noPosition"; 
    actualX = 0; 
    actualY = 0; 
    actualZ = 0; 
} 

- (id)initWithNibName:(NSString *)nibName bundle:(NSBundle *)nibBundle { 
    if (self = [super initWithNibName:nibName bundle:bundle]) { 
     [self initialise]; 
    } 
    return self; 
} 

- (id)initWithCoder:(NSCoder *)decoder { 
    if (self = [super initWithCoder:decoder]) { 
     [self initialise]; 
    } 
    return self; 
} 

这将不论如何创建视图控制器打电话initailise。

+0

我在“initWithCoder”中发出警告 警告:控制到达非void函数结束。 如果在编译时警告应用程序崩溃 – zp26 2010-05-28 18:29:32

+0

糟糕,我已经在我的答案中修复了它;我忘了回归自我;'最后! – deanWombourne 2010-05-29 18:47:59

0

此:

[newPosition setValue:(NSString*)fieldNomePosizione.text:(float)actualX:(float)actualY:(float)actualZ] 

...是乱码。我甚至不知道它是如何编译的。我认为它是一个错字。但是,如果该函数没有返回一个布尔值,它将返回一个void指针,并且总是计算为false,因此块永远不会被调用。

更一般地说,您的问题很可能是因为您没有使用self.propertyName表示法来引用您的属性,因此它们不会被保留。例如。

[arrayPosition addObject:newPosition]; 

应该是:

[self.arrayPosition addObject:newPosition]; 

...也应在代码中arrayPosition所有其他引用。

+0

嗨TechZen,这个问题指出,如果arrayPosition在方法内部初始化,数据会被保存,所以我们可以假设方法'setValue'返回YES;)另外,在init方法中,数组使用alloc] init]这将保留它们。如果他们被宣布而没有被保留,我们可能会看到一个例外:)你对使用自我的好习惯是正确的。arrayPosition虽然 - 这绝对是正确的事情。 – deanWombourne 2010-05-28 15:00:43