7

したがって、スタックオーバーフローを検索すると、Objective-Cでプライベート変数を作成する方法のようです。

@interface ClassName()
{
@private
    NSArray* private;
}
@property (strong, nonatomic) NSArray* public;
@end

今、これは私が混乱するところです。プロパティはとして宣言されて(strong, nonatomic)いますが、プライベート変数にはそのようなものはありません。では、アークはそれが強いかどうかをどうやって知るのでしょうか?

4

3 に答える 3

13

デフォルトでは、インスタンス変数があり__strongます。

AppleのARC移行ガイドから、変数(インスタンス変数を含むと推定される)に関して:

__strongがデフォルトです

以降:

ARCでは、インスタンス変数はデフォルトで強力な参照です。オブジェクトをインスタンス変数に直接割り当てると、オブジェクトの有効期間が延長されます。

これは、プロパティがを介してivarに接続されるまで保持され@synthesizeます。この時点で、プロパティの所有権修飾子が優先されます。ただし、プロパティを強いものとして宣言してから、セッターとゲッターの両方を手動で実装する場合は、バッキングivarの所有権修飾子も手動で宣言する必要があります。

于 2013-03-24T16:52:23.163 に答える
9

プロパティの場合、関連付けられたインスタンス変数の所有権は、プロパティの所有権によって示されます。

http://clang.llvm.org/docs/AutomaticReferenceCounting.htmlを参照してください。

プロパティが合成される場合、関連付けられたインスタンス変数は、@synthesize宣言によって暗黙的に名前が付けられたインスタンス変数です。関連するインスタンス変数がすでに存在する場合、その所有権の資格はプロパティの所有権と等しくなければなりません。それ以外の場合、インスタンス変数はその所有権資格で作成されます。

一般的に、Objective-Cオブジェクトはデフォルトで強力です。

オブジェクトが保持可能なオブジェクト所有者タイプで宣言されているが、明示的な所有権修飾子がない場合、そのタイプは__strong修飾子を持つように暗黙的に調整されます。

LLVM 4.0コンパイラ(Xcode 4.4)以降、@synthesizeステートメントと関連するインスタンス変数は自動的に作成されるため、プロパティを宣言するだけで済みます。

于 2013-03-24T16:54:24.157 に答える
3

の修飾子@propertyは、合成されたセッターおよびその他のARC挿入コードの動作を指定します。変数自体はそれほど強力ではなく、単なるメモリの場所です。だからあなたは今それを強力にコード化しています。

プライベート(およびストロング)にする方法は、.mファイル内のカテゴリでストロングを宣言することです。

// .h
// nothing

// .m
@interface ClassName()
@property (strong, nonatomic) NSArray* myStrongPrivateProperty;
@end

// that's it
于 2013-03-24T16:44:58.263 に答える