0

プロパティとしてを持っているクラスがありNSMutableDictionaryます:

@interface Alibi : NSObject <NSCopying>
@property (nonatomic, copy) NSMutableDictionary * alibiDetails;
@end

次のコンストラクターを使用します。

- (Alibi *)init
{
    self = [super init];
    _alibiDetails = [NSMutableDictionary dictionary];
    return self;
}

およびコピー方法:

- (Alibi *)copyWithZone:(NSZone *)zone
{
    Alibi *theCopy = [[Alibi alloc] init];
    theCopy.alibiDetails = [self.alibiDetails mutableCopy];    
    return theCopy;
}

呼び出そうとするとsetObject:ForKey:、ランタイムエラーが発生しますmutating method sent to immutable object

ビューコントローラでAlibiオブジェクトをとして宣言し、@property (copy, nonatomic) Alibi * theAlibi;で初期化self.theAlibi = [[Alibi alloc] init];viewDidLoadます。

クラッシュする行は次のとおりです。

NSString * recipient;
recipient = @"Boss";
[self.theAlibi.alibiDetails setObject:recipient forKey:@"Recipient"];

ここで私が間違っていることを教えてください。iPhoneでiOS5用にコーディングしています。

4

2 に答える 2

1

'copy'プロパティがあります。これは、NSMutableDictionaryが呼び出された-copyメソッドを取得し、合成されたインスタンス変数に割り当てられる前に通常のNSDictionaryを返すことを正確に意味します。このスレッドは、これを解決するためのいくつかのオプションに関する情報を提供します。

于 2012-08-28T09:22:02.553 に答える
0

このスレッドを完了するために、Alibi以下に改訂されたクラスを含めます。これは、必要に応じて機能します。誰かがメモリリークやその他の問題に気付いた場合は、それをいただければ幸いです。

@implementation Alibi

NSMutableDictionary *_details;

- (Alibi *)init
{
    self = [super init];
    _details = [NSMutableDictionary dictionary];
    return self;
}

- (NSMutableDictionary *)copyDetails
{
    return [_details mutableCopy];
}

- (NSMutableDictionary *)setDetails:(NSMutableDictionary *)value
{
    _details = value;
    return value;
}

- (void)addDetail:(id)value forKey:(id)key
{
    [_details setObject:value forKey:key];
}

- (id)getDetailForKey:(id)key
{
    return [_details objectForKey:key];
}

- (Alibi *)copyWithZone:(NSZone *)zone
{
    Alibi *theCopy = [[Alibi alloc] init];

    theCopy.serverId = [self.serverId copyWithZone:zone];
    theCopy.user = [self.user copyWithZone:zone];
    theCopy.startTime = [self.startTime copyWithZone:zone];
    theCopy.endTime = [self.endTime copyWithZone:zone];
    [theCopy setDetails:[self copyDetails]];

    return theCopy;
}

@end
于 2012-08-28T10:02:07.723 に答える