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

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

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

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

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

Слабо подобен присваиванию?

Ответ 1

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

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

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

Его все здесь.

Ответ 2

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

  • atomic//default
  • неатомической
  • strong = сохранить//по умолчанию
  • слабый
  • сохранить
  • присваивать //default
  • unsafe_unretained
  • Копия
  • только для чтения
  • readwrite//default

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

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

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

Пример:

@property (strong, nonatomic) ViewController *viewController;

@synthesize viewController;

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

Пример:

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

@synthesize myButton;

Объяснить: Благодаря BJ Homer

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

Ответ 3

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

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

Ответ 4

Критическое прозрачное использование свойства 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;

Ответ 5

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

имеем два класса 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;
   }

приведенный выше код будет генерировать цикл сохранения, поскольку оба являются сильным типом   -------- > б --------- > а

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