web-dev-qa-db-ja.com

Objective-Cの弱くて強力なプロパティセッター属性

Objective-Cの弱いプロパティ設定属性と強いプロパティ設定属性の違いは何ですか?

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

影響と利点は何ですか?

IOS 4ではウィークが利用できないため、assignを使用する必要があると聞きました。

割り当てに似た弱いですか?

93
kkurni

特定のファイルに対してARCをオンまたはオフにします。その上でretainreleaseautoreleaseなどを使用できない場合...代わりに、プロパティにstrongweakを使用するか、変数に__strong__weakを使用します(デフォルトは__strong) 。強力は保持と同等ですが、ARCはリリースを管理します。

ウィークを使用したいのは、保持サイクルを回避したい場合だけです(たとえば、親は子を保持し、子は親を保持するため、どちらも解放されません)。

「フリーブリッジ」の部分(NSからCFへのキャスト)は少し注意が必要です。 CFオブジェクトのCFRelease()およびCFRetain()を手動で管理する必要があります。それらをNSオブジェクトに戻す場合、保持カウントについてコンパイラーに伝える必要があります。

そのすべて ここ

102
Robert

変数のプロパティについて私が知っている情報があります

  1. アトミック//デフォルト
  2. 非原子
  3. strong = retain // default
  4. 弱い
  5. 保持する
  6. //デフォルトを割り当てる
  7. unsafe_unretained
  8. コピー
  9. 読み取り専用
  10. readwrite //デフォルト

そのため、上記のすべての属性を見つけることができる詳細な記事リンクがあります。ここで最高の回答をしてくれたすべての人に感謝します!!

iOSの可変プロパティ属性または修飾子

01。strong(iOS4 = retain)-「これをポイントしなくなるまでヒープに保持する」-つまり「私は所有者です。retainと同じように狙いを定める前にこれを解除することはできません。」-オブジェクトを保持する必要がある場合にのみ、strongを使用します。 -デフォルトでは、すべてのインスタンス変数とローカル変数は強力なポインターです。 -UIViewControllers(UIアイテムの親)には通常、strongを使用します-ARCではstrongが使用され、オブジェクトの保持カウントを心配する必要がないため、基本的に役立ちます。 ARCは、作業が完了すると自動的に解放します。strongキーワードを使用することは、オブジェクトを所有していることを意味します。

例:

@property (strong, nonatomic) ViewController *viewController;

@synthesize viewController;

02。weak(iOS4 = unsafe_unretained)-「他の誰かが強く指し示す限りこれを保持する」-assignと同じこと、no保持または解放-「弱い」参照は、保持しない参照です。 -IBOutlets(UIViewControllerのChilds)には通常、weakを使用します。これは、親オブジェクトが存在する場合にのみ子オブジェクトが存在する必要があるため機能します。 -弱参照とは、参照オブジェクトをガベージコレクターによるコレクションから保護しない参照です。 -弱は本質的に割り当てられた、保持されないプロパティです。オブジェクトの割り当てが解除された場合を除き、ウィークポインターは自動的にnilに設定されます

例:

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

@synthesize myButton;

説明BJ Homerに感謝

私たちのオブジェクトが犬であり、犬が逃げる(割り当て解除される)ことを想像してください。強いポインターは犬の綱のようなものです。リーシュを犬に取り付けている限り、犬は逃げません。 5人が1本の犬に綱を付けた場合(1つのオブジェクトへの5つの強力なポインター)、5本の綱すべてが切り離されるまで犬は逃げません。一方、弱いポ​​インターは、小さな子供が犬を指差して、「見て!犬!」と言っているようなものです。犬がひもにつながれている限り、小さな子供たちは犬を見ることができ、犬はそれを指し示します。しかし、すべてのひもが外されるとすぐに、犬はそれを何人の小さな子供が指していても逃げます。最後の強いポインター(リーシュ)がオブジェクトをポイントしなくなるとすぐに、オブジェクトの割り当てが解除され、すべての弱いポインターがゼロになります。弱いときは?ウィークを使用したいのは、保持サイクルを回避したい場合だけです(たとえば、親は子を保持し、子は親を保持するため、どちらも解放されません)。

119
swiftBoy

Robertが参照しているドキュメントの最後の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_unretainedを使用して、弱参照をゼロ化しない弱参照を作成できますが、名前が示すように、これは一般的に推奨されません。

また、ドキュメント内:

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

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
Alen Alexander

例を挙げてさらに詳しく説明します(上記の回答はすでに素晴らしいです)。

2つのクラス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であるため、保持サイクルを生成します

それを回避するには、そのオブジェクトの週プロパティを使用して、オブジェクトを参照し、参照カウントを増加させないようにする必要があります。

0
Anurag Bhakuni