Цель C - присвоить, скопировать, сохранить


84

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

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

Ответы:


127

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

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

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

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

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


2
Спасибо, чувак, я прочитал основы Apple Dev, о моей нынешней разработке. Трудно с управлением памятью "вылетел в objc_msgSend ()" Так что я просто подумал о том, чтобы пересмотреть свое понимание свойств. stackoverflow.com/questions/4506205/…
Sabha B

2
Напоминаем, что ссылка в ответ ведет на общую «Страница не найдена» на сайте Apple. Затем он перенаправляется в «Библиотеку разработчика Mac». Этот SO-ответ содержит полезную информацию: stackoverflow.com/questions/2255861/…
hippeelee

1
Довольно сложно обновить, потому что документация изменилась и ее больше нет в одном удобном месте. Отзыв отправлен в команду разработчиков документации Apple.
Джошуа Ноцци

34

Программирование Управления памяти Руководство по IOS справочной библиотеки имеет основу переуступать, копировать и сохранять аналогии и примерами.

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

сохранить Увеличивает счетчик удержания объекта на 1. Принимает владение объектом.

release Уменьшает счетчик удержания объекта на 1. Отказ от владения объектом.


Спасибо за ответ. Не могли бы вы объяснить 1.ClassA имеет свойство, называемое - (Class B *) functionName; 2.ClassB имеет метод - (void) setHeight; 3. Интерфейс ClassC Я объявил ClassA * tempA как сохраненный. 4. Реализация класса C в конструкторе У меня есть этот оператор ClassB * tempB = tempA.functionName; 5. Когда я пытаюсь отправить сообщение (tempB. SetHeight;) на следующей строке инициализации tempB, моя программа работает нормально.
Sabha B,

6. Помещение того же оператора (tempB. SetHeight;) в некоторую функцию и вызов той же функции, что моя программа получает сбой в objc_msgSend ().
Sabha B,

8
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"
)

2
Окружающее объяснение серьезно улучшило бы ваш ответ.
zx485

4
  1. назначать

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

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

    • указывает, что новое значение должно быть отправлено «-retain» при назначении, а старое значение должно быть отправлено «-release»
    • если вы напишете сохранить, он будет автоматически работать как сильный
    • Такие методы, как «alloc», включают неявное «удержание»
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.