Что именно происходит, когда я устанавливаю свойство объекта с помощью метода доступа? - PullRequest
0 голосов
/ 13 августа 2011

Скажем, у меня есть объект с именем MyClass, свойство которого определено как @property (nonatomic, retain) NSString *foo;, и я синтезирую это свойство.

Затем в другом классе, скажем, делегату приложения я определяю строку (но это может быть что угодно) NSString *myString = [[NSString alloc] initWithString:@"Hi"]; и вызываю экземпляр MyClass: [myClass setFoo:myString];

Что на самом деле происходит?Установлена ​​ли ссылка на пространство, выделенное для myString?Или он получает то, что находится в выделенной памяти для myString и устанавливает его в выделенную память для foo, так как я вызвал retain на foo?

И я должен освободить myString в приложении делегат.И я должен выпустить foo в MyClass, так как он был сохранен, но должен ли я выпустить его снова, так как ему была назначена другая переменная alloc'd?

Ответы [ 3 ]

2 голосов
/ 13 августа 2011

Все зависит от того, как объявлено имущество.Поскольку у вас (retain), он сохранит тот же указатель объекта, а также автоматически отправит -retain, чтобы обеспечить доступ к памяти независимо от того, содержит ли вызывающая сторона ссылку.Если бы вы использовали (copy), он отправил бы -copy, что сделало бы новый объект копией старого (при условии, что объект соответствует `NSCopying).

Все это происходит в реализации вспомогательного оборудованиякоторый обычно генерируется для вас, когда вы используете @synthesize.Если вы реализуете свой собственный код, обязательно используйте правильное поведение!

1 голос
/ 13 августа 2011

@synthesize в основном создает два метода для вас.В вашем случае эти два метода будут похожи на это:

-(NSString*) foo;
{
    return foo; //synthesized ivar
}

-(void) setFoo:(NSString*)newValue;
{
    if(foo != newValue){
        [foo release];
        foo = [newValue retain];
    }
}

Однако @synthesize не освободит значение в dealloc, поэтому вы должны сделать это вручную.

Объекты в Objective-C рассматриваются как указатели, поэтому, когда вы говорите NSString* a = b;, вы не копируете сам объект, а просто делаете еще один указатель на объект.Синтезированные свойства не являются исключением из этого.

0 голосов
/ 13 августа 2011

В результате получается, что объект myString, на который указывает объект, получает количество сохраняемых единиц, увеличенное на единицу при [myClass setFoo:myString];

Первоначально, когда вы выделяете строку и сохраняете ссылку в myString,счетчик сохранения равен 1. Хранение его в свойстве с сохранением, как у вас, увеличивает его счетчик хранения до 2.

Нет, вам не нужно снова его освобождать.Максимальный счет удержания равен 2. Следовательно, 2 релиза.

...