1

そのようにプロパティを宣言するとします

@property (nonatomic, copy) NSObject *property;

次に、カスタム セッター メソッドを作成します。

- (void) setProperty:(NSObject *)property
{
    _property = property;

    // Some more code here
}

コンパイラは、copyこのセッター関数がこれと同等になるようにキーワードを解釈しますか?

_property = [property copy];

それとも、キーワードが動作と一致するようにこのように記述するのは私の責任ですか?

4

1 に答える 1

4

Clang/ARC ドキュメントの「4.1.1 プロパティ宣言」から (強調を追加):

  • copy__strongセッターでのコピー セマンティクスの通常の動作と同様に、所有権を意味します 。
  • ...

プロパティの指定された所有権はそのメタデータに保持されますが、それ以外の場合、プロパティが合成されない限り、意味は純粋に慣習的です。プロパティが合成される場合、関連付けられたインスタンス変数は、@synthesize 宣言によって暗黙的に名前が付けられたインスタンス変数です。関連付けられたインスタンス変数が既に存在する場合、その所有権の修飾はプロパティの所有権と等しくなければなりません。それ以外の場合、インスタンス変数はその所有権修飾で作成されます。

したがって、あなたの場合、カスタムセッターを使用して、プロパティを「コピー」として宣言することは、関連付けられたインスタンス変数_property__strong他に何もないことを意味します。

セッターが実際にコピーを作成するのはあなたの責任です。たとえば、次のようになります。

- (void) setProperty:(NSObject *)property
{
    _property = [property copy];
    // Some more code here
}
于 2014-05-22T19:04:41.060 に答える