Завдання C - Призначити, скопіювати, зберегти


83

Я новачок у цілі C. У мене є базові знання з мови C, включаючи поняття покажчиків. У мене є два основних питання:

  1. Хтось може пояснити різницю між присвоєнням, копіюванням та збереженням за допомогою якоїсь аналогії?
  2. Як ви обробляєте функцію, яка повертає змінну покажчика, і як ви виконуєте обмін повідомленнями через покажчик повернення?

Відповіді:


126

Оновлена ​​відповідь на змінену документацію

Зараз інформація розповсюджена по кількох посібниках у документації. Ось список необхідних матеріалів:

Відповідь на це запитання тепер повністю залежить від того, чи використовуєте ви програму, керовану ARC (сучасна за замовчуванням для нових проектів), або примусове управління пам’яттю.

Присвоїти проти слабкого - використовуйте призначати, щоб встановити покажчик властивості на адресу об’єкта, не зберігаючи його чи іншим чином куруючи його; використовуйте слабке, щоб точка властивості автоматично нульова, якщо присвоєний йому об’єкт звільнено. У більшості випадків вам доведеться використовувати слабкий, тому ви не намагаєтесь отримати доступ до вивіленого об'єкта (незаконний доступ до адреси пам'яті - " EXC_BAD_ACCESS"), якщо не виконаєте належне очищення.

Зберігати в порівнянні з копією - Задекларовані властивості використовують retain за замовчуванням (так що ви можете просто пропустити його взагалі) і автоматично керуватиме підрахунком посилань на об’єкт, незалежно від того, призначений інший об’єкт властивості або встановлений як рівний нулю; Використовуйте копію, щоб автоматично надіслати новопризначеному об’єкту -copyповідомлення (яке створить копію переданого об’єкта і замість цього призначить цю копію властивості - корисно (навіть потрібно) у деяких ситуаціях, коли призначений об’єкт може бути змінений після встановлення як властивість якогось іншого об’єкта (що означало б, що модифікація / мутація стосуватиметься і властивості).


2
Дякую, чувак, я прочитав основи від Apple Dev, про мою нинішню розробку. Важко в управлінні пам'яттю. stackoverflow.com/questions/4506205/…
Sabha B

2
Попереджуючи, посилання у відповіді переходить на загальний "Сторінку не знайдено" на сайті яблук. Потім він перенаправляє на «Mac Developer Library» Цей SO відповідь корисну інформацію: stackoverflow.com/questions/2255861 / ...
hippeelee

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

33

Програмування Управління пам'яті Керівництво по IOS довідкової бібліотеки має основу переуступати, копіювати і зберігати аналогії і прикладами.

copy Створює копію об’єкта та повертає її із збереженим числом 1. Якщо ви копіюєте об’єкт, ви є власником копії. Це стосується будь-якого методу, що містить слово копія, де “копія” відноситься до об’єкта, що повертається.

retain Збільшує кількість утримань об'єкта на 1. Приймає право власності на об'єкт.

випуск Зменшує кількість збережених об’єктів на 1. Відмовляється від права власності на об’єкт.


Дякуємо за відповідь. Не могли б ви пояснити 1.ClassA має властивість, що називається - (Клас 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;) в якусь функцію і виклик тієї ж функції, яку моя програма отримує Crashed у 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”
    • якщо ви пишете retain, він автоматично працюватиме як сильний
    • Такі методи, як “alloc”, включають неявний “retain”
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.