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


94

В чем разница между слабыми и сильными атрибутами установщика свойств в Objective-C?

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

Какое влияние и польза?

Я слышал, что weak недоступен в iOS 4, и нам нужно использовать assign.

Слабо похоже назначить?


Ответы:


102

У вас либо включен или выключен ARC для определенного файла. Если он включен, вы не можете использовать и retain release autoreleaseт.д ... Вместо этого вы используете strong weakдля свойств или __strong __weak для переменных (по умолчанию __strong). Сильный эквивалентно сохранению, однако ARC сделает выпуск за вас.

Единственный раз, когда вы захотите использовать weak, - это если вы хотите избежать циклов сохранения (например, родительский элемент сохраняет дочерний элемент, а дочерний элемент сохраняет родительский элемент, поэтому ни один из них никогда не освобождается).

Часть «бесплатное соединение» (преобразование из NSв CF) немного сложна. Вам по-прежнему придется вручную управлять CFRelease()и CFRetain()для CF-объектов. Когда вы конвертируете их обратно в объекты NS, вы должны сообщить компилятору о счетчике сохранения, чтобы он знал, что вы сделали.

Все здесь .


119

Вот информация, которую я знаю о свойствах переменных

  1. атомарный // по умолчанию
  2. неатомный
  3. strong = сохранить // по умолчанию
  4. слабый
  5. сохранить
  6. назначить // по умолчанию
  7. unsafe_unreolated
  8. копировать
  9. только чтение
  10. readwrite // по умолчанию

так что ниже есть подробная ссылка на статью, где вы можете найти вышеупомянутые все атрибуты, которые демонстративно вам помогут. Большое спасибо всем, кто дает здесь лучшие ответы !!

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

01. strong (iOS4 = сохранить) - он говорит: «Держите это в куче, пока я не перестану указывать на это» - другими словами «Я владелец, вы не можете освободить это до того, как прицельтесь, отлично с тем же самым «- Используйте сильный только в том случае, если вам нужно удержать предмет. - По умолчанию все переменные экземпляра и локальные переменные являются сильными указателями. - Обычно мы используем strong для UIViewControllers (родителей элемента пользовательского интерфейса) - strong используется с ARC и в основном помогает вам, не беспокоясь о счетчике сохраненных объектов. ARC автоматически освобождает его, когда вы закончите с ним. Использование ключевого слова strong означает, что объект принадлежит вам.

Пример:

@property (strong, nonatomic) ViewController *viewController;

@synthesize viewController;

02. weak (iOS4 = unsafe_unrehibited) - он говорит: « Сохраняйте это, пока кто-то другой указывает на это сильно» - то же самое, что присваивать, не сохранять или освобождать - «Слабая» ссылка - это ссылка, которую вы не сохраняете. - Обычно мы используем weak для IBOutlets (дочерние элементы UIViewController). Это работает, потому что дочерний объект должен существовать только до тех пор, пока существует родительский объект. - слабая ссылка - это ссылка, которая не защищает объект, на который указывает ссылка, от сбора сборщиком мусора. - Слабое, по сути, присвоенное, несохраняемое свойство. За исключением случая, когда объект освобождается, слабый указатель автоматически устанавливается на ноль

Пример :

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

@synthesize myButton;

Объясните : Спасибо Би Джей Гомеру

Представьте, что наш объект - собака, и собака хочет убежать (быть освобожденной). Сильные указатели похожи на поводок для собаки. Пока собака привязана к поводку, она не убежит. Если пять человек прикрепят поводок к одной собаке (пять сильных указателей на один объект), то собака не убежит, пока не будут сняты все пять поводков. С другой стороны, слабые указатели похожи на маленьких детей, указывающих на собаку и говорящих: «Смотри! Собака!» Пока собака все еще на поводке, маленькие дети все еще видят собаку и будут указывать на нее. Однако как только все поводки отсоединены, собака убегает, сколько бы на нее ни указывали маленькие дети. Как только последний сильный указатель (привязка) больше не указывает на объект, объект будет освобожден, а все слабые указатели будут обнулены. Когда мы используем слабый? Единственный случай, когда вы захотите использовать weak, - это если вы хотите избежать циклов сохранения (например, родительский элемент сохраняет дочерний элемент, а дочерний элемент сохраняет родительский элемент, поэтому ни один из них никогда не освобождается).


1
В первоначальном списке я не совсем понимаю, что вы имеете в виду под словом «по умолчанию». У вас есть оба параметра strong=retainи assignпомечены как значения по умолчанию, но не может быть обоих одновременно.
Слипп Д. Томпсон

27
Понравилось сравнение собаки на поводке. Объясняет это довольно хорошо.
Jarrett Barnett

1
Хорошее объяснение, хотя iOS не использует сборку мусора. ARC! = Сборка мусора (!), Это разные технологии.

1
weak и unsafe_unrehibited - разные (в первом используются слабые ссылки с нулевым значением, а во втором - приседания)
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_unrehibited, но, как следует из названия, это обычно не рекомендуется.

Также в документации:

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
Используя weak в своих свойствах, я получаю предупреждение: «Слабый приемник может быть непредсказуемо установлен на ноль». Я видел некоторые другие сообщения, в которых для предотвращения этого предупреждения вам необходимо создать сильную локальную ссылку. И если это правда, какой смысл делать свойство слабым, если в конце мне нужно создать сильную ссылку?
arh

0

давайте возьмем пример, чтобы уточнить детали (приведенный выше ответ уже хорош), пусть этот пример поможет немного больше

пусть у нас есть два класса A и B

//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

поэтому, чтобы избежать этого, вы должны использовать свойство week одного из них, чтобы он еженедельно ссылался на объект и не увеличивал его количество ссылок.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.