Слабые и сильные атрибуты установщика свойств в Objective-C - PullRequest
93 голосов
/ 27 октября 2011

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

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

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

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

Является ли слабый аналог присвоения?

Ответы [ 5 ]

119 голосов
/ 21 марта 2013

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

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

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

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

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

Пример:

@property (strong, nonatomic) ViewController *viewController;

@synthesize viewController;

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

Пример:

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

@synthesize myButton;

Объясните : Благодаря Б.Дж. Гомеру

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

101 голосов
/ 27 октября 2011

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

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

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

Здесь все .

2 голосов
/ 27 февраля 2015

Кристально чистое использование свойства 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;
2 голосов
/ 17 января 2012

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

// 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_unretained, но, как следует из названия, это обычно не рекомендуется.

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

Weak references are not supported in Mac OS X v10.6 and iOS 4.
0 голосов
/ 04 июля 2014

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

пусть у нас есть два класса 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

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

...