Авто-релиз и NSString в Задаче C - PullRequest
0 голосов
/ 05 сентября 2010

Я сейчас так много играю с ObjC, что я чувствую себя потерянным в том, что касается "автоматического выпуска".

в моем .h:

NSString *sAStringMember;

по моему .m:

-(void) createAString
{
 NSString *sAString = [NSString stringWithString:[dummyCode...get String ffrom some input field for instance]];
 sAStringMember = sAString;
}

Несколько коротких вопросов:

  1. В «createAString:» создается автоматически выпущенная строка «sAString». Если sAString автоматически освобожден (когда это произойдет?), Мой член sAStringMember также укажет на неверный адрес, верно?

  2. Если приведенные выше предположения верны, можно ли было бы выпустить sAStringMember, прежде чем присвоить ему sAString, а затем сохранить его?

  3. Лучше всего использовать копию для копирования sAString в sAStringMember, я полагаю?

René

Ответы [ 2 ]

2 голосов
/ 05 сентября 2010

(1) Да.
(3) Либо -retain, либо -copy в порядке.

Лучше всего использовать объявленное свойство.

@interface Foo : ... {
  NSString* sAStringMember;
}
@property(copy) NSString* sAStringMember;   // or retain.
@end
...
@implementation Foo
@synthesize sAStringMember;
...
-(void) createAString {
  self.sAStringMember = [dummyCode...get String ffrom some input field for instance];
}
-(void)dealloc {
  ...
  [sAStringMember release];
  [super dealloc];
}
@end

(такжеПожалуйста, избегайте венгерских обозначений.)

0 голосов
/ 05 сентября 2010

Да, если вы храните указатель на объект откуда-то еще и сохраняете его, вы всегда должны копировать или сохранять его. Сохранение предпочтительнее, если вы не хотите изменять его, потому что оно не выделяет дополнительную память и работает быстрее.

На ваш вопрос о том, когда будет освобождена строка, единственный возможный ответ: через некоторое время после того, как ваша функция вернулась.

Во многих книгах вы можете прочитать, что это произойдет, когда будет обработано следующее событие GUI, но это не точно. В последовательности вызова функций каждая функция может открывать и закрывать свой пул автоматического выпуска.

Если функция выполняет большую часть работы, она может просто создать свой пул автоматического выпуска и освободить зарегистрированные объекты автоматического выпуска в любое время.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...