3

Objective-Cの強ポインターと弱ポインタ​​ーの概念的な違いを明らかにするこの質問に対する受け入れられた優れた回答を読んだばかりですが、実際の違いを理解しようとしています。私はこれらの概念が存在しないC++のバックグラウンドから来ており、どちらを使用するかを理解するのに苦労しています。

誰かがObjective-Cコードを使用して、強ポインターと弱ポインタ​​ーのさまざまな使用法を示す実際的な例を提供してもらえますか?

4

2 に答える 2

8

コンセプト

それはすべて保持カウントについてです。ARCは、開発者が手動で保持および解放することを心配するのを防ぐための便利な機能です。基本的に、強い変数は保持カウントを1増やしますが、弱い変数は上げません。

下記参照:

@interface Test () {
    NSString* strongVariable; // Instance variables default to strong
    __weak NSString* weakVariable;
}
@end

// This has a retain count of 1, it has been allocated to memory by the user, and stored in a local variable (which is strong)
NSString* str = [[NSString alloc] initWithString:@"Test"];

// The string object will now have a retain count of 2, as the strong variable has increased its retain count
strongVariable = str;

// This weak variable does **not** increase the retain count, and as such it will still be 2
weakVariable = str;

// --

// Now, lets remove some references
// This will reduce the retain count to 1, as a strong variable has lost its link
strongVariable = nil;

// This will also reduce the retain count, as another strong variable has lost it's reference. This means the retain count is 0, and the object can now be considered to not exist
str = nil;

// What happens to weakVariable?
// Because it is referencing an object with a 0 retain count, the runtime will set the value of this variable automatically to nil (iOS 5 and above).
NSLog(@"%@", (weakVariable == nil) ? @"nil" : @"Not nil") // Will print "nil"

強い変数が保持カウントが0のオブジェクトを参照している状況に陥ることはできません。これは、強い変数のコアコンセプトに反するものです。注目に値するのは、横__weakにあります__unsafe_unretained。これは弱い変数と同じように機能しますが、保持カウントがゼロになると自動的にnilに設定されないため、メモリのランダムな部分へのポインタが含まれます(アクセスするとクラッシュするため、nilする必要があります)あなた自身)。これが存在する理由は、iOS 4がARCをサポートしているためですが、ではありません__weak。ほとんどの場合、を使用します__weak

上記の説明は実用的な一見であり、このドキュメントを使用してさらに詳しく読むことができます。

実用的なアプリケーション

__strongデフォルトではすべてです。弱くしたい場合は、を使用する必要があります__weak

概念的に特定のオブジェクトを所有したくない場合は、通常、弱い変数を使用します。車はエンジンとホイールを所有しますが、ドライバーは所有しません。

Wheel* wheel;
Engine* engine;
__weak Driver* driver;

逆に、ドライバーは車を所有します。

Car* car;

車がドライバーを所有している場合、保持サイクルがあります。車がドライバーを所有し、ドライバーが車を所有します。一方をリリースするとしたら、もう一方はどうなるでしょうか。保持サイクルの概念全体は、この質問の範囲を上回りますが、ここでそれについて読むことができます。

同じ概念が、デリゲートなどのプログラミングパターンにも当てはまります。テーブルビューの場合、ビューコントローラはテーブルビューを所有しますが、テーブルビューはビューコントローラを所有しません(これはデリゲートとして使用されます)

//ViewController
UITableView* tableView;
tableView.delegate = self;     

//UITableView
@property (nonatomic, weak) id<UITableViewDelegate> delegate;

ガッチャ

の深刻な使用法の1つ__weakは、ブロック内です。それらがないと、気付かずに保持サイクルを引き起こすという深刻なリスクにさらされます。繰り返しますが、これはこの質問の範囲を上回りますが、詳細についてはここを参照してください

C++との類似性

TR1内では、共有ポインタを使用できます。これらを使用すると、ヒープに割り当てられたオブジェクトをスタックに割り当てられたオブジェクト内に配置でき、メモリを管理します。これは、参照カウントを使用して行われます。共有ポインタを別の変数に渡すたびに、参照カウントが増加します。これは、Obj-Cの強力な変数に割り当てることに似ています。

于 2012-11-29T10:47:44.880 に答える
1

私が見つけたところによると、弱いポインターは主に、子側からの親子関係に使用されます。親へのポインタを弱いプロパティに設定することにより、子は親を所有せず、所有権の関係を回避できます。

この投稿は私がこれらの新しい概念を理解するのに大いに役立ちました、あなたはそれを見る必要があります: http ://www.raywenderlich.com/5677/beginning-arc-in-ios-5-part-1

于 2012-11-29T10:50:46.680 に答える