2011-02-01 3 views
0

Привет всем (извините за мой английский). Я новичок в программировании на языке программирования objetive-C и iOS. Можете ли вы мне помочь?Управление памятью в iOS

@interface RootViewController : UITableViewController 
{ 
    NSMutableArray *keysFromQuery; 
} 

@property (nonatomic, retain) NSMutableArray *keysFromQuery; 
.... 
.... 
NSString *category = [keysFromQuery objectAtIndex:0]; 

Что будет с [keysFromQuery objectAtIndex: 0], если я: [категория релиз] ;?

Что произойдет с категорией, если я сделаю после этого: [keysFromQuery release] ;?

Не знаю, как работают ссылки и механизмы памяти.

Спасибо!

ответ

3

Не звоните -release по телефону category. Вы не являетесь владельцем объекта. Вы должны только освобождать объекты, которые вы взяли на себя, через NARC (new/alloc/сохранить/копировать). Для получения дополнительной информации читайте Memory Management Programming Guide.

0

Если метод, который возвратил вам объект, явно не указывает, что он возвращает «новый», «сохранить» ed, «alloc» ed, «created» или «copy» -ied object, вы не должны его выпускать , Это так просто.

Так что релиз (или autorelease) только в тех случаях, как

[object retain]; 
[object copy]; 
[SomeClass newInstanceWithProperty: @"a"]; 
[[SomeClass alloc] initWithProperty: @"a"]; 

т.д.

Так что в этом случае вам не нужно ничего делать, и «освободить» вы упоминаете бы сбой вашего приложения, по всей вероятности.

+0

+ после [keysFromQuery release] ссылка на объект, которую вы получили из контейнера (строка категории), станет недействительной. –

0

Что произойдет с [keysFromQuery objectAtIndex: 0], если я это сделаю: [category release] ;? Вы не должны этого делать, потому что это автореализованный объект.

Что произойдет с категорией, если я сделаю после этого: [keysFromQuery release] ;? NSString по-прежнему сохраняется при освобождении ключейFromQuery после инициализации.

0

Не отпускайте объекты так, как вы их не владеете, и вы даже не выделили их.

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