Слабкі та сильні атрибути встановлення властивостей у Objective-C


94

Яка різниця між слабкими та сильними атрибутами властивостей в Objective-C?

@property(retain, [weak/strong]) __attribute__((NSObject)) CFDictionaryRef myDictionary;

Який вплив та користь?

Я чув, що слабкий недоступний на iOS 4, і нам потрібно використовувати assign.

Слабкий подібний до призначення?


Відповіді:


102

У вас або ARC увімкнено або вимкнено для певного файлу. Якщо його увімкнено, ви не можете використовувати retain release autoreleaseі т.д. ... Натомість ви використовуєте strong weakдля властивостей або __strong __weak змінних (за замовчуванням __strong). Strong - це еквівалент збереження, однак ARC буде керувати випуском за вас.

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

Частина "безкоштовного мосту" (кастинг з NSдо CF) трохи складна. Вам все одно доведеться вручну управляти CFRelease()і CFRetain()для об'єктів CF. Коли ви перетворюєте їх назад у об'єкти NS, ви повинні повідомити компілятору про кількість збережень, щоб він знав, що ви зробили.

Це все тут .


119

Ось інформація, яку я знаю про властивості змінних

  1. атомний // за замовчуванням
  2. неатомний
  3. strong = retain // за замовчуванням
  4. слабкий
  5. зберегти
  6. assign // за замовчуванням
  7. небезпечно_не збережено
  8. копія
  9. лише для читання
  10. readwrite // за замовчуванням

отже, нижче знаходиться детальне посилання на статтю, де ви можете знайти вищезазначені всі атрибути, які зухвало вам допоможуть. Велике спасибі всім людям, які тут дають найкращі відповіді !!

Атрибути властивостей змінних або модифікатори в iOS

01. сильний (iOS4 = утримувати) - там написано "зберігайте це в купі, поки я більше на це не вказую" - іншими словами "Я є власником, ви не можете розмовляти з цим, перш ніж прицілитися з тим самим, що і утримувати "- Ви використовуєте сильний, лише якщо вам потрібно зберегти об'єкт. - За замовчуванням усі змінні екземпляра та локальні змінні є сильними вказівниками. - Як правило, ми використовуємо сильний для UIViewControllers (батьки елемента інтерфейсу) - сильний використовується з ARC, і це в основному допомагає вам, не турбуючись про кількість збережених об’єктів. ARC автоматично видає його для вас, коли ви закінчите з цим. Використання ключового слова strong означає, що ви є власником об’єкта.

Приклад:

@property (strong, nonatomic) ViewController *viewController;

@synthesize viewController;

02. слабкий (iOS4 = unsafe_unretain) - там написано "тримати це до тих пір, поки хтось інший на нього вказує сильно" - те саме, що призначити, не зберігати чи відпускати - "слабке" посилання - це посилання, яке ви не зберігаєте. - Ми, як правило, використовуємо слабкі для IBOutlets (потомки UIViewController). Це працює, оскільки дочірній об’єкт повинен існувати лише до тих пір, поки існує батьківський об’єкт. - слабке посилання - це посилання, яке не захищає об'єкт, на який посилається, від збору збирачем сміття. - Слабкий - це, по суті, присвоєне, незатримане властивість. За винятком випадків, коли об'єкт вивільняється, слабкий покажчик автоматично встановлюється на нуль

Приклад:

@property (weak, nonatomic) IBOutlet UIButton *myButton;

@synthesize myButton;

Поясніть : Завдяки Б. Дж. Гомеру

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


1
У початковому списку я не зовсім впевнений, що ви маєте на увазі під словом «за замовчуванням». Ви обидва strong=retainі assignпозначені за замовчуванням, але це не може бути і тим, і іншим.
Сліпп Д. Томпсон,

27
Насолоджувався собакою на повідку порівняння. Пояснює це досить добре.
Jarrett Barnett

1
Хороше пояснення, хоча iOS не використовує збір сміття. ARC! = Вивіз сміття (!), Це різні технології.

1
слабкі та небезпечні_незбережені різні (перший використовує нульові слабкі посилання, тоді як другий присідає)
wcochran

1
Я вивчаю лише iOS, але, схоже, ви не використали weakі strongу своїх прикладах. Чи не було б більш зрозумілим, що батько має strongпосилання на своїх дітей (як myButtonвластивість UIViewControllerкласу, яким ви показали себе weak) і що діти зберігають weakпосилання на своїх батьків (як viewControllerвластивість дочірнього класу, який ви ' замість цього встановлено на strong). Наприклад, читаючи книгу Метта Нойбурга, iOS 7 Programming Fundamentalsвін показує, що клас, який оголошує свого делегата як властивість, буде тримати його `слабким, що здається справедливим.
Богдан Александру

2

Щоб назвати частини документів, на які посилається Роберт, які явно відповідають на два останні запитання:

// The following declaration is similar to "@property(assign) MyClass *myObject;"
// except that if the MyClass instance is deallocated,
// the property value is set to nil instead of remaining as a dangling pointer.
@property(weak) MyClass *myObject;

Це називається нульовим слабким посиланням. Ви можете створювати слабкі посилання, які не обнуляють слабкі посилання, використовуючи __unsafe_unretain, але, як випливає з назви, це, як правило, не рекомендується.

Також у документах:

Weak references are not supported in Mac OS X v10.6 and iOS 4.

1
Так, це правильно, __unsafe_unretainedце версія ARC assign.
Роберт,

2

Кристально чисте використання властивості WEAK полягає в наступному:

Any control whose properties we need to change(eg:text of a label) is declared weak and as below:

@property(nonatomic,weak) IBOutlet Type *name;
Eg: @property(nonatomic,weak) IBOutlet UILabel *myLabel;

1
Використовуючи слабкі властивості, я отримую попередження: "Слабкий приймач може бути непередбачувано встановлений на нуль". Я бачив деякі інші дописи, що, щоб запобігти цьому попередженню, ви повинні створити локальний сильний довідник. І якщо це правда, який сенс робити властивість слабким, якщо в кінці мені доведеться створити сильну довідку?
arh

0

давайте візьмемо приклад, щоб детальніше розробити (відповідь вище вже чудова), нехай цей приклад трохи більше допоможе

нехай маємо два класи А і В

//A.h

#import <Foundation/Foundation.h>
#import "B.h"

@interface A : NSObject

@property (nonatomic, strong) B *objB;

@end

@implementation A
//

@end

//B.h

    #import <Foundation/Foundation.h>
    #import "A.h"


    @interface B : NSObject

    @property strong text(nonatomic, strong) A *objA;

    @end

    @implementation B
    //

    @end

    and in main

    #import "B.h"
    #import "A.h"

    {
    A *obja =[[A alloc]init];
    B *objb =[[B alloc]init];
    A.objB=objb;
    B.objA=obja;
   }

наведений вище код генерує цикл збереження, оскільки обидва є сильним типом a --------> b ---------> a

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

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