Использование initWithObjects: вызывает сбой, но initWithCapacity: сопровождается addObject: не - PullRequest
0 голосов
/ 13 декабря 2011

Действительно странная проблема.Я должен инициализировать массив в - (void)viewDidLoad.

Массив, prjMemberArray объявлен как свойство:

@property(nonatomic, retain) NSMutableArray* prjMemberArray;

Если я использую это

prjMemberArray = [[NSMutableArray alloc] initWithObjects:@"someone",@"someone",@"someone" ,nil];

с release, вызванным в viewDidUnload,

, затем, когда загружается представление, оно немедленно падает, но когда я использую это:

prjMemberArray = [[NSMutableArray alloc] initWithCapacity:0];

[prjMemberArray addObject:@"someone"];

, оно работает хорошо.Кто-нибудь может объяснить это?Я использую раскадровку для представления текущего контроллера представления, например:

UIStoryboard* sb = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];  
prj_Detail = [sb instantiateViewControllerWithIdentifier:@"ProjectDetailVC"]; 

[self presentModalViewController:prj_Detail animated:YES];

, где prjMemberArray является свойством prj_Detail.

Ответы [ 2 ]

1 голос
/ 15 декабря 2011

Вы уверены, что не написали орфографические ошибки и не написали, например, "someone" вместо @"someone" в сценарии сбоя?

0 голосов
/ 15 декабря 2011

Не забудьте использовать self при обращении к свойствам.Вот безопасный способ объявить, что, не беспокоясь о утечках:

Заголовок:

@property(nonatomic, retain) NSMutableArray* prjMemberArray;

Реализация:

@synthesize prjMemberArray=_prjMemberArray;

- (void) viewDidLoad {

    [super viewDidLoad];

    NSMutableArray *prjMemberArray = [[NSMutableArray alloc] initWithObjects:@"someone", @"someone", @"someone" ,nil];

    self.prjMemberArray = prjMemberArray;

    [prjMemberArray release];
}

- (void) dealloc {

    [_prjMemberArray release];

    [super dealloc];
}

@ свойство создает методы получения и установкидля вашей переменной, но часто путают с самой переменной.Когда они выпустили XCode4, я полагаю, что они добавили возможность устанавливать, как вы хотите, чтобы переменная экземпляра была названа, выполнив:

@synthesize prjMemberArray=_prjMemberArray;

До XCode4 вы просто сделали:

@synthesize prjMemberArray;

Так что@property делает за кулисами нечто вроде этого:

-(NSMutableArray*) prjMemberArray {
    return _prjMemberArray;
}

-(void) setPrjMemberArray:(NSMutableArray *) val {
    if( _prjMemberArray != nil )
        [prjMemberArray release];

    _prjMemberArray = [val retain];
}

Так что не думайте о @property как о самой переменной и не забывайте всегда использовать self при обращении ких.Это должно избавить вас от боли и утечек памяти.

...