私のNSArrayControllerは読み込み専用NSArrayControllerの内容は読み込み専用であっても変更されますか?
@property (readonly) NSArrayController *rootObjectsArrayController;
であるが、その内容はとにかく
[[aClass rootObjectsArrayController] setContent:contentArray];
を変更し、それが動作します。どうして ?
私のNSArrayControllerは読み込み専用NSArrayControllerの内容は読み込み専用であっても変更されますか?
@property (readonly) NSArrayController *rootObjectsArrayController;
であるが、その内容はとにかく
[[aClass rootObjectsArrayController] setContent:contentArray];
を変更し、それが動作します。どうして ?
ためApple's ObjectiveC refを参照してください。
ゲッターから返されたオブジェクトを変更することは何もありません。これは、プロパティを介してアクセスした後に配列にオブジェクトを追加することができる、読み取り専用のプロパティとして可変配列があった場合も同じです。
属性readonly
を持つプロパティのみread
アクセサが生成されることを意味しない(合成した)ので、setRootObjectsArrayController
ようにはセッター、そのオブジェクトが読み取り専用になることを意味するものではありません。
だからこそあなたはまだメッセージを渡すことができます。例えば、あなたが発生したアクセサメソッドを経由してrootObjectsArrayControllerとして新しいアレイコントローラを設定することはできません -
はちょうどあなたがそのプロパティを設定することができないことを意味のみプロパティ定義のために読むの詳細
はこれを見て、多くの方法がありますが、私の作品の方法はこれです:
読み取り専用であるプロパティは、舞台裏でそれを行う場合を除き、あなたが(そのプロパティに別のオブジェクトを割り当てることができないことを意味し、それは別の問題です)。
ただし、可変オブジェクトの場合は内部オブジェクトを変更するようオブジェクトに依頼することができます。
あなたが実際にこれを見たい場合は、あなたが問題のオブジェクトのアドレスを印刷するNSLog
を使用することができます:あなたがここで見ることができますどのような
NSArray *contentArray = [NSArray arrayWithObject: @"First array"];
NSArray *anotherContentArray = [NSArray arrayWithObject: @"Second array"];
[[aClass rootObjectsArrayController] setContent:contentArray];
NSLog(@"Controller address: %p, content array address: %p", [aClass rootObjectsArrayController], [[aClass rootObjectsArrayController] content]);
[[aClass rootObjectsArrayController] setContent:anotherContentArray];
NSLog(@"Controller address: %p, content array address: %p", [aClass rootObjectsArrayController], [[aClass rootObjectsArrayController] content]);
は、コントローラは両方のケースで同じアドレスを持っているということですしたがって、内容が変更された後も同様です。したがって、それはまだ同じインスタンスです。
変更された内容は、コントローラーオブジェクトの内部であり、setContent:
メッセージで変更されたコンテンツのアドレスです。