Визначення @property з ARC: сильний чи зберегти?


80

Використовуючи Xcode 4.2 та ARC, я помічаю, що автоматично згенерований код для NSManagedObjectдосі читається так для властивостей:

@property (nonatomic, retain) NSString * someString;

1) Чи не слід retainтепер замінювати на strongабо weak?

2) Чому досі використовується автоматично згенерований код retain

3) Яка правильна заміна retainв цій заяві про властивості?

Зараз я налагоджую проблему, використовуючи NSFetchRequest, і я думав, що це може бути джерелом проблеми. Думки?


Ви повинні прийняти відповідь вже зараз.
Rivera

Відповіді:


110

1) Чи не слід утримувати зараз замінювати сильним чи слабким?

Ні. Ви не можете замінити retain на слабкий; вони різні. А сильний - це синонім на 100% для retain; вони однакові. Ви можете використовувати будь-який, тож тут немає "слід". Ви можете замінити retain на сильний, якщо хочете, але не обов’язково.

2) Чому автоматично згенерований код все ще використовує retain

Чому ні? Див. (1). правильне збереження, тому немає проблем.

3) Яка правильна заміна для збереження в цій заяві про властивість?

Немає необхідності замінювати фіксатор.

Зараз я налагоджую проблему за допомогою NSFetchRequest, і я думав, що це може бути джерелом проблеми. Думки?

Це не так.


9
Однак я б сказав, що для спільноти, яка одержима (і справедливо!) Стандартами та дотриманням Apple Way (s), бачення збереження лише у синтезованих моделях є незначним. Я переходжу на сильного, щоб бути педантичним. По-перше, полегшує роботу над великим проектом неправильного синтаксису серед півтора десятка інших дрібниць.
Ерік Голдберг,

12
Не знаю точно, що таке емоційна архітектура. Чи можете ви навести приклад у "холодному, ясному світлі дня?" ;-) false і NO - це синоніми, але ми використовуємо NO за домовленістю в Objective-C. Є причини для послідовності; бути непослідовним - це нормально, але тягар доказувати гідність лежить на тій, що порушує конвенцію, а не на тій, яка її дотримується.
Eric Goldberg

9
З усією повагою, @EricGoldberg має певний момент: конвенція має значення. І оскільки ви будете знаходитись __strongв інших місцях свого коду (такого немає __retain), можливо, ви захочете перейти на використання strongдля послідовності. Це схоже на послідовний відступ коду, хоча код і без цього працюватиме нормально.
Dan Rosenstark

3
@matt: якщо ви подивитесь на мій оригінальний коментар, той, де ви звинуватили мене в кодуванні "емоційно" (що б це не було), ви побачите, що я використовую слова "позиція" та "просто для того, щоб бути педантичним". Я насправді пропоную "повинно", а не "є".
Eric Goldberg

1
УСЕ ПРОГРАМУВАННЯ - це ідіома. Інших питань немає. Усе програмування є синонімом, вся інженерна практика програмування полягає у використанні поточної ідіоми, щоб додати значення коду для клієнта.
Fattie

40

Відповісти на всі три запитання в одному: retainі strongє синонімами один одного, тому обидва правильні. У документації зазначено

retainпередбачає __strongправо власності

strongпередбачає __strongправо власності


Дякую за відповідь. Я читав документ Apple на ARC. Я розумію, що retain перекладається на сильний. Однак це не пояснює, чому код, який автоматично генерується Xcode при створенні нових NSManagedObject (s), дасть вам @property (неатомний, зберегти)
one09jason

3
Якщо я чогось тут не пропускаю, це прекрасно це пояснює. Код, який створює Xcode, правильний, оскільки retain працює настільки ж сильно, тому де ваше запитання?
Фліббо,

6
Якщо запустити ARC-рефакторинг на своєму проекті, він перетворить усі ці retains на strongs. Отже, моє враження, що strongце найкращий атрибут, але генератор NSManagedObject не оновлений. Але це лише здогадки; можливо, ніхто в Apple не вважає відмінність важливою.
теорія

4

Перед ARC ви повинні «звільнити» об’єкт, який утримується. Це означає, що retain має зустрічну частину. Після ARC випускати не потрібно. Тому використовуйте сильний. Це візуальна підказка, що вам не потрібно називати звільнення.


3

"утримувати" дорівнює "сильному".

"сильний" використовується, наприклад:

@property (nonatomic, strong) NSString * someString;

А "__strong" використовується, наприклад:

-(void) someMethod
{
    __strong NSString* vStr = [[NSString alloc] initWithString:@"some string"];
}

На Apple Docs. каже:

Атрибути властивостей

Ключові слова слабкі та сильні вводяться як нові оголошені атрибути властивостей, як показано в наступних прикладах.

// The following declaration is a synonym for: @property(retain) MyClass *myObject;
property(strong) MyClass *myObject;

Apple doc. http://developer.apple.com/library/ios/#releasenotes/ObjectiveC/RN-TransitioningToARC/Introduction/Introduction.html

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.