4

私は公式のチュートリアルYour second iOS App:Storyboardに従っていますが、次のようにプロパティmasterBirdSightingListを宣言するように指示されました(特定の例であり、コンテキストを知る必要はありません):

@property (nonatomic, copy) NSMutableArray *masterBirdSightingList;

属性copyがあることに注意してください。そして、このプロパティを合成します:

@synthesize masterBirdSightingList = _masterBirdSightingList;

次に、私を混乱させた init メソッドが 1 つあります。

- (void)initializeDefaultDataList {
NSMutableArray *sightingList = [[NSMutableArray alloc] init];
self.masterBirdSightingList = sightingList;
[self addBirdSightingWithName:@"Pigeon" location:@"Everywhere"];
}

間違いなく、sightingList がスペースに割り当てられ、masterBirdSightingList プロパティに割り当てられます。ただし、プロパティにはコピー属性があります。これは、インスタンス変数_masterBirdSightingListが、 sightingListからのものを保持するために別のスペースに割り当てられることを意味します。なんで?次のようにプロパティにスペースを直接割り当てないでください:

self.masterBirdSightingList = [[NSMutableArray alloc] init];
4

1 に答える 1

8

Objective-Cでは、copyプロパティの属性は、合成されたセッターが次のようになることを意味します。

-(void)setMasterBirdSightingList:(NSMutableArray*)newValue
{
    if (_masterBirdSightingList == newValue) return;
//  NSMutableArray* oldValue = _masterBirdSightingList;
    _masterBirdSightingList = [newValue copy];
//  [oldValue release];    // <-- not applicable in ARC.
}

そのドット構文は常に次のように変換されます

[self setMasterBirdSightingList:sightingList];

プロパティの属性に関係なく。

「sightingListからのものを保存するために別のスペースに割り当てられた」ものは、-copy​​メソッドを介して実行されます。セッターのnewValueパラメーターに引数を渡す方法は関係ありません。


編集:コメントで@David-copyが述べたように、可変型のメソッドは不変オブジェクトを返します。-mutableCopy代わりに呼び出すには、セッターをオーバーライドする必要があります。NSMutableArrayなどの可変オブジェクトでObj-C2.0プロパティを使用するための最良の方法は何ですか?を参照してください。。

于 2012-05-23T17:34:51.480 に答える