1

UITabBar.hで、適切に署名されたコピー

@property(nonatomic、copy)NSArray * items; //表示する/設定する

それは配列ですそして「コピー」とはどういう意味ですか?NSArrayコンテナobjをコピーしますか?NSArrayに含まれるすべてのobjをコピーしますか?か何か。

だからテストがあります

UITabBar* testBar = [[UITabBar alloc] init];
UITabBarItem* item = [[UITabBarItem alloc] init];
NSArray* array = [[NSArray alloc] initWithObjects:item, nil];

NSLog(@"bar:%p,%d", testBar, testBar.retainCount);
NSLog(@"item:%p,%d", item, item.retainCount);
NSLog(@"array:%p,%d", array, array.retainCount);

testBar.items = array;

NSLog(@"that item:%p,%d", [testBar.items lastObject], [[testBar.items lastObject] retainCount]);
NSLog(@"testBar.items:%p,%d", testBar.items, testBar.items.retainCount);

結果

バー:0x96a9750,1

アイテム:0x96aa230,2

アレイ:0x96aa280,1

そのアイテム:0x96aa230,2

testBar.items:0x96aa280,6

コンテナ配列も配列内のobjも「コピー」されていないのはなぜですか?

4

2 に答える 2

2

2つのこと:

  • コレクション-copyは常に浅いです。コレクション要素をコピーしません(実際、これらの要素がコピー可能であること、つまりNSCopyingプロトコルに準拠していることを保証するものは何もありません)。これは、コピーされない理由objを説明しています–余分な保持はありません。

  • Foundationは、可能な限り、 -copytoの実装を最適化しようとします。-retainたとえば、-[NSString copy]は不変の文字列の保持です。コレクションのコピーは浅いため、同じ最適化が不変のコレクションに対して機能します。そのためarray、コピーされずに保持されます。

于 2012-08-20T03:28:31.150 に答える
1

この場合、コピーが作成されていない理由は、NSArray不変であるためです。アレイへの変更を防ぐためにコピーを作成する必要はありません。そのような変更はできないためです。同じ不変の配列を保持するだけで十分です。

この実験をNSMutableArrayで試してみると、異なる結果が得られます。

于 2012-08-20T03:05:41.507 に答える