3

私は最も優れたAccessorizerを使用して、XcodeでObj-Cコードのセッター/ゲッターを自動的に生成しています。最近、Accessorizerに変更が加えられました。

古いバージョンのAccessorizer:
@property(nonatomic、retain)NSMutableSet * setA;
@property(非アトミック、保持)NSMutableSet * setB;

Accessorizerの新しいバージョン:
@property(nonatomic、copy)NSMutableSet * setA;
@property(nonatomic、copy)NSMutableSet * setB;

悲しいことに、新しいバージョンは私のコードをクラッシュさせます。私のコードでは、次のことを行います。

self.setA = [[[NSMutableSet alloc] init] autorelease];
self.setB = [[[NSMutableSet alloc] init] autorelease];

//..。

[self.setA minusSet:self.setB];  

上記のコード行は、古い方法(保持)を使用すると正常に機能しますが、新しい方法(コピー)を使用するとクラッシュします。明らかにここで何かがおかしい。私はAccessorizerに大きく依存しています。誰かがNSMutableSetのコンテキストでコピー/保持を使用することの意味を明確にできますか?

ありがとう、
ダグ

4

2 に答える 2

4

プロパティタイプが可変セットである場合は、保持が必要になる可能性があります。変更不可能なセット(別名NSSet)の場合、Appleのガイドラインでは、保持するのではなくコピーを使用するように定められています。

違いは、可変セットが変更されることが予想されることです。変更不可能なセットは変更されないままであると予想されますが、保持として宣言されている場合、誰かがそれを変更可能なセットに設定してから、予期せず内容を変更する可能性があります。

于 2010-09-30T15:52:41.963 に答える
4

はい、これはプロパティの「機能」です。として宣言されているプロパティを設定するとcopy、生成されたセッターがオブジェクトを呼び出し-copyます。残念ながら、可変オブジェクトの場合、これは不変のバリアントになります。

つまり、によって返されるオブジェクトは[myMutableSet copy]変更できません

セットを変更可能にする必要がある場合は、を使用する必要があります(または、代わりにretain使用するセッターをオーバーライドします)。mutableCopycopy

これについてバグを報告しましたが(rdar:// 8416047)、「設計どおりに機能する」としてクローズされました。(オブジェクトが可変であるかどうかをセッターが知る方法が実際にはないため)

于 2010-09-30T15:57:03.453 に答える