Пояснення сильної та слабкої пам’яті в iOS5


114

Я новачок у розробці iOS5 та використанні aim-c. У мене проблеми з розумінням різниці між сильним і слабким сховищем. Я прочитав документацію та інші запитання щодо ПП, але всі вони звучать однаково для мене, без подальшого розуміння.

Я читав документацію: Перехід до ARC - вона посилається на умови збереження, призначення та випуску iOS4; що мене бентежить. Потім я розглядаю Open U CS193p, де він розрізняє сильних і слабких:

Сильний : "тримайте це в купі, поки я на це більше не вказую"
Слабкий : "зберігайте це до тих пір, поки хтось інший вказує на це сильно".

Хіба два визначення не є ідентичними = якщо вказівник більше не вказує на об’єкт, то звільнить пам'ять, що тримає об'єкт? Я розумію поняття покажчиків, купи, розподілу чи дислокації пам'яті - але яка різниця між сильними та слабкими?


Модель управління пам'яттю як і раніше актуальна, навіть якщо ви використовуєте ARC. Ви все ще повинні розуміти підрахунок посилань, просто не потрібно робити це вручну. Тож ваш останній абзац - необгрунтований попит.
jrturton

Відповіді:


509

Різниця полягає в тому, що об’єкт буде розміщений, як тільки на нього не буде сильних покажчиків. Навіть якщо слабкі покажчики вказують на це, як тільки останній сильний покажчик зникне, об’єкт буде розміщений, а всі інші слабкі вказівники будуть нульовими.

Можливо, приклад є в порядку.

Уявіть, наш об’єкт - собака, і що собака хоче втекти (бути розселеною).

Сильні покажчики - як повідок на собаці. Поки ви прив’язуєте повідку до собаки, собака не втече. Якщо п’ять людей прив’язують повідку до однієї собаки (п’ять сильних вказівників на один об’єкт), то собака не втече, поки всі п’ять повідців не від'єднаються.

З іншого боку, слабкі вказівники - це як маленькі діти, що вказують на собаку і говорять: "Дивись! Собака!" Поки собака ще на повідку, маленькі діти ще можуть побачити собаку, і вони все одно вкажуть на неї. Як тільки всі повідці відриваються, собака тікає незалежно від того, скільки маленьких діток на неї вказують.

Як тільки останній сильний покажчик (повідок) більше не вказує на об’єкт, об’єкт буде розміщений, і всі слабкі покажчики будуть нульовими.


2
Це засновано на аналогії, яку Малком Кроуфорд в Apple дав кілька років тому. Не знаю, де він його взяв.
BJ Гомер

Я пам’ятаю, як читав щось подібне (до дуги) у книзі, думаю, що це Гільгаґас, але тоді він міг дістати це десь із іншого… Хоча це добре!
jrturton

14
+1 відмінний приклад. це похідне з прикладу Hillegass про те, як повідці утримуються / вивільняються, але я люблю цю адаптацію для сильних / слабких.
Дейв Делонг

2
@DaveDeLong: Добре, що вони 10.6 нелегальні з ARC. Ви взагалі не можете їх використовувати. Тож це якось нерелевантний момент.
BJ Гомер

5
Ще один хороший варіант - це гелієві кулі: якщо тримається хоча б одна струна, вона не випливе. Аналогії повідця / повітряної кулі також хороші в тому, що люди можуть забути, що "право власності" управляється за допомогою утримування / випуску.
Стів Веллер

34

Чи не ці два визначення однакові.

Абсолютно не. Ключова відмінність двох визначень, які ви вказали, - це "доки хтось інший". Це "хтось інший", що важливо.

Розглянемо наступне:

__strong id strongObject = <some_object>;
__weak id weakObject = strongObject;

Тепер у нас є два покажчики <some_object>, один сильний і один слабкий. Якщо ми встановлюємо , strongObjectщоб nilвиглядати приблизно так:

strongObject = nil;

Тоді, якщо ви перейдете до описаних вами правил, тоді ви задасте собі ці питання:

  1. Сильний: "тримай це в купі, поки я більше не вказую на це"

    strongObjectбільше не вказує <some_object>. Тож нам не потрібно його тримати.

  2. Слабкий: "зберігайте це до тих пір, поки хтось інший на це сильно вкаже"

    weakObjectвсе ще вказує на <some_object>. Але оскільки ніхто більше не вказує на це, це правило також означає, що нам не потрібно його дотримуватися.

Результат - це <some_object>розміщення, і якщо ваш час роботи підтримує його (Lion та iOS 5 вгору), то weakObjectавтоматично буде встановлено значення nil.

Тепер розглянемо , що відбудеться , якщо ми встановлюємо , weakObjectщоб nilвиглядати приблизно так:

weakObject = nil;

Тоді, якщо ви перейдете до описаних вами правил, тоді ви задасте собі ці питання:

  1. Сильний: "тримай це в купі, поки я більше не вказую на це"

    strongObjectдійсно вказує на <some_object>. Тож нам потрібно його тримати.

  2. Слабкий: "зберігайте це до тих пір, поки хтось інший на це сильно вкаже"

    weakObjectне вказує <some_object>.

Результатом є те , що <some_object>це НЕ звільнятися, але weakObjectбуде nilпокажчик.

[Зверніть увагу, що все, що припускається <some_object>, не вказується іншим сильним посиланням десь в іншому місці / якимось іншим засобом "тримання"]


1
Отже, головна відмінність між сильними і слабкими полягає в тому, що розселення об'єктів, на які сильно вказують, автоматично зніме всі пов'язані слабкі покажчики. І щоб слабкий покажчик вказував на щось, завжди існує сильний покажчик. Якщо так, на головний об’єкт програми слід чітко вказати?
KMC

Щоб слабкий вказівник вказував на щось дійсне, тоді так, має бути сильний вказівник. Додайте до цього той факт, що iOS 5 та Lion підтримують автоматичне видалення слабких посилань, і ви отримуєте те, що ви говорите. Виконання iOS 4 не підтримує цього. "Головний об'єкт програми", я вважаю, ви маєте на увазі UIApplicationоб'єкт? На це буде сильно посилатися внутрішня робота UIKit- але вам не потрібно про це хвилюватися.
mattjgalloway

Я думаю, ви можете використовувати слово типу "strongObjectPointer" замість "strongObject". Тож Нові люди для програмування матимуть краще значення. Приємний улов на @BJ Homer пост Mr.Matt.Interesting :)
Vijay-Apple-Dev.blogspot.com

2

Сильний

  1. Створює право власності між властивістю та присвоєною цінністю.
  2. Це властивість об'єкта в ARC за замовчуванням, тому він не дає вам турбуватися про кількість посилань та автоматично звільняти посилання.
  3. Це заміна на утримування. Ми використовуємо, якщо і тільки якщо нам потрібно використовувати як зберегти.

Слабкий

  1. Створює невласність між властивістю та присвоєною вартістю.
  2. Сильний використовується на батьківському об'єкті, а слабкий - на дочірньому об'єкті, коли батьківський вивільнений, тоді посилання на дочірній об'єкт також встановлено на нульове
  3. Це допомагає запобігти утриманню циклів.
  4. Він не захищає посилається об'єкт під час збору сміттєзбірника.
  5. Слабке, по суті, присвоєне, невлаштоване майно.

Тут варто згадати, що зазвичай складається цикл утримування. У нас є два об'єкти: об’єкт A і об'єкт B. Об'єкт A має чітку посилання на об'єкт B, а об'єкт B має чітку посилання на об'єкт A. Ніщо інше не має чіткого посилання на об'єкт A або B.
boro

2

Інший приклад: студент - це Object, вважаючи, що він / він може закінчити ( deallocate) до тих пір, поки він / він закінчив усі основні курси ( strong pointers), незалежно від того, чи буде він / він брати додаткові курси ( weak pointers). Іншими словами: сильний покажчик є єдиним фактором розстановки цього питання Object.


1

Ні, вони не однакові, але дуже різні. Ви використовуєте сильний, лише якщо вам потрібно зберегти об'єкт. Ви використовуєте слабкий у будь-якому іншому випадку, з дегідністю, що можете дізнатися, чи вилучили об’єкт ha з купи, оскільки його ніхто не зберігає.


1

Я знаю, що я досить спізнююся з цією партією, але я вважаю, що важливо плутати проблему, вказавши, що значення "сильних і слабких моделей пам'яті" залежить від того, говорити ви про програмне забезпечення або обладнання.

Для апаратних засобів слабкий або сильний вказує, чи є підтримка послідовної послідовності.

[SC означає, що] ... результат будь-якого виконання такий же, як якщо б операції всіх процесорів були виконані в якомусь послідовному порядку, а операції кожного окремого процесора з'являються в цій послідовності в порядку, визначеному його програмою. - Лампорт, 1979

WTF це стосується пам'яті? Це означає, що записи на змінні різними процесорами повинні бачитися в одному порядку в усіх процесорах. У техніці із сильною моделлю це гарантується. Що стосується апаратури зі слабкою моделлю, це не так.

Існуючі відповіді тлумачать питання лише з точки зору моделей програмної пам'яті. Обладнання не має значення для програмування. У цьому самому питанні згадується iOS, який, як правило, працює на процесорах Arm7. Arm7 має слабку модель пам'яті. Для програмістів, звикших до процесорів із сильною моделлю - що ми всі, тому що x86 та x64 мають сильну модель - це жахлива пастка. Використання bool для сигналізації іншої нитки для виходу працює чудово у сильній моделі. Один і той же код на Arm взагалі не працює, якщо ви не позначите прапор непостійним, і навіть тоді він нестабільний.

Хоча це правда, що Arm8 + це суттєво змінює з явною підтримкою придбання / випуску, застаріле програмне забезпечення не підтримує цю підтримку. Спадкове програмне забезпечення включає всі три ОС телефону та все, що працює на них, а також компілятори та бібліотеки до їх оновлення.

Для розширеного вивчення цієї теми я посилаю вас на неповторну траву Саттер .

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