Цель C - присвоить, скопировать, сохранить - PullRequest
78 голосов
/ 22 декабря 2010

Я новичок в Цели C. У меня есть базовые знания в C, включая концепцию указателей. У меня есть два основных вопроса:

  1. Может ли кто-нибудь объяснить разницу между присваиванием, копированием и сохранением по аналогии?
  2. Как вы обрабатываете функцию, которая возвращает переменную-указатель, и как вы отправляете сообщения через указатель возврата?

Ответы [ 4 ]

118 голосов
/ 22 декабря 2010

Обновленный ответ для измененной документации

Информация теперь распространяется по нескольким руководствам в документации. Вот список обязательного чтения:

Ответ на этот вопрос теперь полностью зависит от того, используете ли вы приложение, управляемое ARC (современный стандарт по умолчанию для новых проектов), или принудительное ручное управление памятью.

Assign vs. Weak - Используйте assign , чтобы установить указатель свойства на адрес объекта, не сохраняя его или не обрабатывая его иным образом; используйте слабый , чтобы свойство автоматически указывало на ноль, если объект, назначенный ему, освобожден. В большинстве случаев вы захотите использовать слабый , поэтому вы не пытаетесь получить доступ к освобожденному объекту (недопустимый доступ к адресу памяти - "EXC_BAD_ACCESS"), если вы не выполняете надлежащую очистку.

Retain vs. Copy - В объявленных свойствах по умолчанию используется retain (так что вы можете просто полностью его опустить), и он будет управлять счетчиком ссылок объекта автоматически, если другой объект назначен свойство или оно установлено в ноль; Используйте copy для автоматической отправки вновь назначенному объекту сообщения -copy (которое создаст копию переданного объекта и назначит эту копию вместо свойства - полезно (даже требуется) в некоторых ситуациях, когда назначенный объект может быть изменен после установки в качестве свойства какого-либо другого объекта (что будет означать, что изменение / мутация также будет применяться к этому свойству).

31 голосов
/ 22 декабря 2010

Руководство по программированию управления памятью из Справочной библиотеки iOS содержит основы назначения, копирования и сохранения с аналогиями и примерами.

копия Делает копию объекта и возвращает ее с сохранением счетчика 1. Если вы копируете объект, вы владеете копией. Это относится к любому методу, содержащему слово copy, где «copy» относится к возвращаемому объекту.

retain Увеличивает количество сохраняемых объектов на 1. Принимает право собственности на объект.

release Уменьшает количество сохраняемых объектов на 1. Оставляет Право собственности на объект.

7 голосов
/ 25 ноября 2016
NSMutableArray *array = [[NSMutableArray alloc] initWithObjects:@"First",@"Second", nil];
NSMutableArray *copiedArray = [array mutableCopy];
NSMutableArray *retainedArray = [array retain];

[retainedArray addObject:@"Retained Third"];
[copiedArray addObject:@"Copied Third"];

NSLog(@"array = %@",array);
NSLog(@"Retained Array = %@",retainedArray);
NSLog(@"Copied Array = %@",copiedArray);

array = (
    First,
    Second,
    "Retained Third"
)
Retained Array = (
    First,
    Second,
    "Retained Third"
)
Copied Array = (
    First,
    Second,
    "Copied Third"
)
4 голосов
/ 26 апреля 2015
  1. assign

    • assign - атрибут свойства по умолчанию
    • assign - атрибут свойства, сообщающий компилятору, как синтезировать реализацию сеттера свойства
  2. copy:

    • copy требуется, когда объект является изменяемым
    • copy возвращает объект, который вы должны явно освободить (например, в dealloc) в средах без сбора мусора
    • вам нужно освободить объект, когда закончите с ним, потому что вы сохраняете копию
  3. оставьте:

    • указывает, что новое значение должно быть отправлено «-retain» при назначении, а старое значение отправлено «-release»
    • , если вы сохраните его, оно автоматически будет работать как сильный
    • как «alloc» включает в себя неявное «retain»
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...