4

所有者オブジェクト (MyObject) によってのみ変更される NSMutableArray があります。そのため、最初の試みはそれを読み取り専用プロパティにすることでした。問題は、このクラスが NSCoding を実装しており、NSCoding ではアーカイブされたオブジェクトが読み書き可能プロパティである必要があることです。

次に、(m ファイルで宣言された) プライベート プロパティを持ち、プライベート配列を返すパブリック メソッドを持つことを考えました。しかし、これは配列への参照になり、他のクラスはそれを変更できます。

他のクラスがこの配列内の各 item= を変更できるようにしたいが、配列自体は変更できないようにするため、私のメソッドもこの配列のコピーを返すべきではありません。

質問:読み取り専用のパブリック プロパティを保持し、同時にそれをアーカイブおよびアーカイブ解除できるようにするにはどうすればよいですか?

4

1 に答える 1

4

これを行う方法はいくつかありますが、合理的な方法の 1 つは、非公開の変更可能な配列を維持し、パブリックに読み取り専用のアクセサーを提供することです。次に、パブリック アクセサーが内部配列の不変のコピーを返すようにします。それは次のようになります。

.h ファイル内:

@interface MyClass : NSObject

@property (readonly) NSArray *publicArray;

@end

.m ファイル内:

@interface MyClass ()

@property NSMutableArray *privateArray;

@end

@implementation MyClass

+ (NSSet *)keyPathsForValuesAffectingValueForKey:(NSString *)key
{
    NSSet *keyPaths = [super keyPathsForValuesAffectingValueForKey:key];

    if ([key isEqualToString:@"publicArray"]) {
        keyPaths = [keyPaths setByAddingObject:@"privateArray"];
    }

    return keyPaths;
}


@synthesize privateArray = _privateArray;

- (NSArray *)publicArray { return [self.privateArray copy]; }

@end

-publicArray実行時例外がスローされたのではなく、スローされた結果に対してミューテーション メソッドを呼び出そうとするコードについて警告するコンパイラを信頼できる場合は、コピーなしで実行できます。もう 1 つの注意点は、コピーがないと、プライベート配列への変更は、不変と思われる配列への以前に取得された参照であっても「見られる」ことです。

于 2012-07-11T18:13:52.633 に答える