2010-05-28 177 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