2010-10-24 5 views
0

Объективные документы C сказать этот атрибут о сохранить в свойствах:вопрос о сохранить атрибут в свойствах

«сохранить Указывает, сохраняющие следует ссылаться на объект при назначении (по умолчанию правопреемником.) предыдущий. значение отправляется сообщение о выпуске ».

Я думал, что я понял, свойства и атрибуты, пока я не видел что-то подобное в справочном руководстве UITableViewCell:

@property (неатомической, только для чтения, сохранения) UIImageView * ImageView

затем чтение выше действительно путают меня ,

мои вопросы: 1) Предположим, у меня есть:

@interface SomeClass: NSObject { 
    NSString *b; 
} 
@property (nonatomic,retain) NSString *b; 
@end 

затем в файле реализации:

@implementation SomeClass 
@synthesize b; 

- (id) initWithSomeString(NSString *c) { 
    if (self = [super init]) { 
     b = c; 
    } 
} 
@end 

это не увеличит сохранить счетчик объекта, на который указывает «Ъ» верный? Теперь я запутался об этом, потому что цель C док говорит, что:

«сохранить Указывает, сохраняющие следует ссылаться на объект при назначении (. По умолчанию правопреемником) предыдущее значение посылается сообщение об освобождении.»

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

3) Я слышал в некоторых местах, что нехорошо вызывать метод setter объекта в его собственном инициализаторе. Зачем? Для меня, если вам это нехорошо делать, то нужно было бы:

NSString * b = [someOtherString сохранить];

, который кажется странным, учитывая, что вы сделали собственность из «b».

4) Имея «@property (сохранить, только для чтения) SomeObject * t, как в приведенном выше примере UITableViewCell, также запутан.« Readonly »означает, что getter не синтезируется. Если мое понимание« сохранения »верное (то есть это происходит только в инкубаторе), то это действительно кажется противоречивым

заранее спасибо

ответ

0

B = C;.! не будет увеличивать количество сохранить, но

self.b = с; будет увеличиваться количество остатков

2) да, второй вызывает сеттер, поэтому он увеличивает счетчик сохранения. Первое - это примитивное назначение C.

3) на самом деле, это должно быть:

b = [someothestring copy]; 

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

4) сохранить, поскольку внутренне объект сохраняется.только для чтения, потому что для кода, использующего этот класс, не разрешено устанавливать это поле, а только класс.

+0

Спасибо за ваш ответ, но поскольку он относится к # 4, я все еще немного смущен. Я не понимал, что вы подразумеваете под «сохранить, потому что внутри, объект сохраняется». Насколько я понимаю, вы можете явно сохранить объект в инициализаторе, но поскольку он имеет атрибут «Только для чтения», вы не можете использовать установщик (синтезированный) для его выполнения. Таким образом, «сохранить» в атрибуте кажется излишним, если ваш единственный способ его удержания состоит в том, чтобы явно вызвать удержание на нем. – user482393

+0

«Сохранить» в @property означает, что если вы не определяете сеттер, компилятор определит его как: - (void) setFoo: (NSString *) newFoo {if (foo! = NewFoo) {[foo release ]; foo = [newFoo сохранить]; } только потому, что он говорит, что readonly в файле .h не останавливает вас от переопределения строки @property в вашем .m-файле в блоке MyClass() @interface. – DavidPhillipOster

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