Являются ли геттеры одинаковыми для всех свойств в target-c? - PullRequest
3 голосов
/ 10 сентября 2011

Этот простой вопрос беспокоит меня. Являются ли геттеры одинаковыми для

@property (nonatomic, retain) NSString *name
@property (nonatomic, copy) NSString *name 

- (NSString*) name{
    return name;    
}

Ответы [ 6 ]

7 голосов
/ 10 сентября 2011

Согласно документации

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

И поведение получателя, и поведение установщика определяются объявлениями свойств.В вашем примере это правильно, так как оно определено nonatomic, но если бы nonatomic отсутствовало в объявлении, оно было бы реализовано аналогично этому

- (NSString*) name{
    [_internal lock]; // lock using an object-level lock
    id result = [[name retain] autorelease];
    [_internal unlock];
    return result;
}

Это, конечно, верно, только если вы используете @synthesize и не переопределяйте и не изменяйте методы получения и установки.

3 голосов
/ 10 сентября 2011

Да, как утверждают другие ответы, получатели такие же. Параметры retain, copy и assign определяют способ создания сеттеров, но не имена даже этих.

Если вы хотите использовать другое имя получателя, например, если у вас есть BOOL, такое как UIApplication свойство idleTimerDisabled, то вы делаете это с помощью специально назначенного имени получателя:

@property(nonatomic, getter=isIdleTimerDisabled) BOOL idleTimerDisabled

Без переопределения, такого как это, имя получателя всегда будет именем свойства.

2 голосов
/ 10 сентября 2011

Если вы используете ARC (Automated Reference Counting), тогда все получатели должны выглядеть так, как показано выше.Однако новый стандарт с ARC должен использовать strong и weak вместо retain и assign соответственно.retain и assign по-прежнему будут работать и являются синонимами strong и weak, но во всех вновь созданных файлах вместо них будут использоваться эти слова, поэтому важно понимать, что они означают.

Есливы не используете ARC (все еще вариант, даже в iOS 5 и Lion), геттеры могут отличаться в зависимости от retain, copy или assign.

retain и copy оба выглядят так:

- (NSString *)name {
    return [[name retain] autorelease];
}

assign довольно прост, но обычно используется для слабых ссылок (например, делегатов):

- (id)delegate {
    return delegate;
}

Я пошелв некоторых деталях, потому что важно понимать, что при использовании ARC код для всех 3 выглядит одинаково, но поведение все еще очень похоже на то, что написано выше.Если вы используете atomic вместо nonatomic, вам нужно добавить несколько строк блокировки / разблокировки, чтобы сделать метод потокобезопасным.В любом случае обычно лучше использовать средства доступа по умолчанию, сгенерированные с помощью @synthesize, если вы не хотите сделать что-то действительно сложное.

2 голосов
/ 10 сентября 2011

Да, copy и retain влияют только на сеттер, а не на геттер. На заметку, вы должны выбрать copy вместо retain для неизменных объектов, таких как NSString.

2 голосов
/ 10 сентября 2011

Да, они одинаковы.retain, copy и assign дают только инструкции компилятора о том, как генерировать сеттеры, а не геттеры.

1 голос
/ 10 сентября 2011

Да, они есть.Имя получателя зависит только от имени свойства.

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