Подтвердить что ты не робот

Objective-C 101 (сохранить vs назначить) NSString

Вопрос 101

Скажем, я делаю базу данных автомобилей и каждый объект автомобиля определяется как:

#import <UIKit/UIKit.h>

@interface Car:NSObject{
    NSString *name;
}

@property(nonatomic, retain) NSString *name;

Почему это @property(nonatomic, retain) NSString *name;, а не @property(nonatomic, assign) NSString *name;?

Я понимаю, что assign не будет увеличивать счетчик ссылок, как будет выполняться retain. Но зачем использовать retain, так как name является членом объекта todo, область его для себя.

Никакая другая внешняя функция не изменит ее.

4b9b3361

Ответ 1

В Objective-C нет такой вещи, как "область действия объекта". Правила области не имеют ничего общего с временем жизни объекта - счет сохранения - это все.

Обычно вам требуется заявить права собственности на переменные экземпляра. См. правила управления памятью Objective-C. С свойством retain, ваш установщик свойств заявляет о праве собственности на новое значение и отказывается от права собственности на старый. С свойством assign окружающий код должен это делать, что также беспорядок с точки зрения ответственности и разделения проблем. Причина, по которой вы должны использовать свойство assign, находится в том случае, когда вы не можете сохранить значение (например, такие, как типы без объекта, такие как BOOL или NSRect), или если его сохранение приведет к нежелательным побочным эффектам.

Кстати, в случае NSString правильный тип свойства обычно copy. Таким образом, он не может измениться из-под вас, если кто-то переходит в NSMutableString (что действительно - это своего рода NSString).

Ответ 2

и не забудьте получить к нему доступ через

self.name = something;

потому что

name = something;

не будет заботиться о сгенерированных методах setter/getter, но вместо этого присвойте значение напрямую.

Ответ 3

Без retain нет гарантии, что NSString*, который вы устанавливаете name, будет жить дольше, чем сама инструкция присваивания. Используя свойство retain для синтезированного сеттера, вы позволяете ему сообщать системе управления памятью, что есть хотя бы еще один объект, заинтересованный в поддержании NSString*.

Ответ 4

Для тех, кто ищет его, документация Apple по атрибутам свойств здесь.

Ответ 5

self. in:

self.name = something;

важно! Без него вы напрямую обращаетесь к переменной и обходите сеттер.

Более старый стиль (исправьте меня, если я ошибаюсь):

[self setName:something];

Во всяком случае, это обозначение было (смутно знакомым) советом, который мне действительно нужен, когда я искал правильный @properties на NSStrings. Спасибо Axel.

Ответ 6

После прочтения столь многих статей, сообщений SO и демонстрационных приложений, чтобы проверить атрибуты свойств Variable, я решил объединить все данные атрибутов

  • atomic//default
  • неатомической
  • strong = сохранить//по умолчанию
  • weak = unsafe_unretained
  • сохранить
  • присваивать //default
  • unsafe_unretained
  • Копия
  • только для чтения
  • readwrite//default

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

Измененные атрибуты свойств или модификаторы в iOS

  • сохранить = сильный
    • он сохраняется, старое значение освобождается и назначается
    • Сохранить указывает, что новое значение должно быть отправлено - получить при назначении и отправленное старое значение -release
    • сохранить то же самое, что и сильный.
    • apple говорит, что если вы напишете, сохраните, он будет автоматически преобразован/работает как сильный.
    • методы, такие как "alloc", включают неявное "сохранение"

Пример:

@property (nonatomic, retain) NSString *name;

@synthesize name;
  1. правопреемником
    • назначает значение по умолчанию и просто выполняет присвоение переменной
    • assign - это атрибут свойства, который сообщает компилятору, как синтезировать реализацию средства установки свойств.
    • Я бы использовал назначение для примитивных свойств C и слабый для слабых ссылок на объекты Objective-C.

Пример:

@property (nonatomic, assign) NSString *address;

@synthesize address;

Ответ 7

Google Objective-C Руководство по стилю охватывает это довольно хорошо:

Сеттеры, берущие NSString, должны всегда копировать строку, которую он принимает. Никогда просто не сохраняйте струну. Это позволяет избежать того, что вызывающий абонент меняет его без вашего ведома. Не предполагайте, что, поскольку вы принимаете NSString, это не NSMutableString.

Ответ 8

Было бы неудовлетворительно, если бы ваш класс получил этот строковый объект, а затем исчез из-под него? Вы знаете, как второй раз, когда ваш класс упоминает этот объект, он был удален другим объектом?

Вот почему вы хотите использовать семантику retain setter.