управление памятью с помощью метода set-set - PullRequest
0 голосов
/ 21 августа 2010

У меня есть вопрос о выделении и освобождении объектов:

если у меня есть такой код:

MyObject *object = [[MyObject alloc] init];
NSMutableString *string = [[NSMutableString alloc]initWithString:@"bla"];
object.myString = string;
NSLog(@"retain count: %d",[object.myString retainCount]); //gives me 2
[string release];
NSLog(@"retain count: %d",[object.myString retainCount]); //gives me 1

Чем я имею именно то, что хочу. Мне нужна только одна ссылка, и я должен сохранить счет 1

но

если я использую

object.myString = [[NSMutableString alloc]initWithString:@"bla"];

моя собственность выглядит так:

@property (nonatomic,retain) NSMutableString *myString;

один alloc и один метод set с сохранением дают мне как счет удержания 2

Если я отпускаю объект после отставки, то приложение вылетает. Я не знаю почему?

Итак, мне всегда нужно создавать объект с временной ссылкой, чем назначать реальную ссылку и освобождать временную ссылку, как первый код?

или есть другой способ?

1 Ответ

1 голос
/ 21 августа 2010

Да и нет. Как правило, это общая схема:

// create the object, retain count 1
MyObject *myObject = [[MyObject alloc] init];

// increment the retain count in the setter
self.myObjectProperty = myObject;

// let go of the object before the end of the current method
[myObject release];

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

MyObject *myObject = [[[MyObject alloc] init] autorelease];
self.myObjectProperty = myObject;

// all done!

Со многими из классов, предоставляемых Apple, вы можете использовать методы класса, кроме alloc / init, чтобы получить объекты, которые уже автоматически освобождены. Ваш пример может быть переписан как:

MyObject *myObject = [[MyObject alloc] init];
myObject.myString = [NSMutableString stringWithFormat:@"bla"];

Последнее замечание: -retainCount - тупой объект. Особенно с NSStrings и другими встроенными классами, он может возвращать результаты, которые сильно отличаются от ожидаемых. Как правило, вам следует избегать этого.

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