2010-05-28 3 views
0

У меня проблема. Это мой код. Когда я пытаюсь использовать IBAction SavePosition, «arrayPosition» не обновляется. Иначе, если я инициализирую «arrayPosition» в «SavePosition», значение сохраняется в массиве. Почему эта аномалия?Проблема инициализации

#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

ответ

4

Что происходит?

Держу пари, что вы создаете свой контроллер вида в файле xib?

Если установить точку останова внутри вашего метода инициализации на линии

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» предупреждение: управление достигает конца функции non-void. Если скомпилировать с предупреждением об ошибке приложения – zp26

+0

К сожалению, я исправил его в своем ответе; Я забыл вернуть себя; в конце! – deanWombourne

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 возвращает ДА;) Кроме того, в методе init массивы объявляются с использованием alloc] init] которые сохранят их. Если бы они были объявлены и не были сохранены, мы, вероятно, увидели бы исключение :) Вы правы в хорошей практике, используя себя.arrayPosition, хотя это определенно правильная вещь. – deanWombourne

Смежные вопросы