10

ここで明らかな何かが欠けている可能性がありますが、オブジェクトの1つにNSCopyingを実装しています。そのオブジェクトには、オブジェクトの外部で使用してはならないため、ゲッターを介して公開されないプライベートインスタンス変数があります。

の実装ではcopyWithZone:、新しいインスタンスをalloc / initする必要がありますが、現在のインスタンスと一致するようにその状態を設定する必要もあります。明らかに現在のプライベート状態に内部からアクセスできますcopyWithZone:が、その状態のアクセサーがないため、新しいオブジェクトに設定することはできません。

データのプライバシーを損なわずに、これを回避する標準的な方法はありますか?

ありがとう。

4

3 に答える 3

8

まず、プライベートであっても、常にゲッターが必要です。オブジェクトは、アクセサーを使用して独自のivarにのみアクセスする必要があります(ごく少数の場合を除く)。これにより、メモリ管理に関する多大な苦痛を軽減できます。

次に、上記のゲッターのルールに違反している場合でも、->を使用するというAlexの提案は標準的なアプローチです。その規則には少数の例外があり、コピーはその1つです。ここでプライベートセッターを使用することはまだ合理的です(そして私はそれを排他的にそのように使用していました)が、さまざまな理由で->を使用するとよりクリーンに機能することがよくあります。

メモリ管理を正しく行うように十分注意してください。に電話する必要がある場合は、自分で使用しなくても[super copyWithZone:]、の複雑さとNSCopyObject()それがどのように影響するかについても読む必要があります。これについては、「NSCopyObject()は有害だと考えられている」で詳しく説明しました。

于 2010-04-02T15:31:19.960 に答える
5

コピーのインスタンス変数に直接アクセスできます。構造体で使用するのと同じポインター逆参照構文を使用します。したがって、たとえば、クラスがこれである場合:

@interface MyCopyableClass : NSObject {
    int anInstanceVariable;
}
@end

あなたはこれを行うことができます:

- (id)copyWithZone:(NSZone *)zone {
    MyCopyableClass *theCopy = [[[self class] allocWithZone:zone] init];
    theCopy->anInstanceVariable = anInstanceVariable;
    return theCopy;
}
于 2010-04-02T15:22:53.217 に答える
1

1つのオプションは、プライベートiVar値を受け入れるカスタム初期化子を作成することです。したがって、次のように作成します。

-(id) initWithPropertyOne:(SomeClass *) anObject andPropertyTwo:(SomeClass *) anotherObject;

コピーをインスタンス化するときは、カスタム初期化子を使用するだけです。

于 2010-04-02T15:32:26.447 に答える