1

iOS の経験はあまりありませんが、いくつかのレガシー コードに取り組んでいます。このプロジェクトでは、オブジェクトを辞書のキーとして使用します。

NSMutableDictionary * dict;
RoleContainer * role = [Class getRole];
[dict setObject:[Class getData] forKey:role];

ロールを別の関数に渡しました。データを取得しようとすると:

data = [dict objectForKey:role];

戻り値が空の場合もあります。約10%の確率で発生します。コードを調べてみると、役割を関数に渡した後、「役割」オブジェクトの参照が変更されていることがわかりました。たとえば、0x002bf500 から 0x00222bad まで。

なんで?

4

3 に答える 3

2

クラスをうまく操作するにNSMutableDictionaryは、メソッドとメソッドRoleContainerを実装する必要があります。そうしないと、同じロールがディクショナリに 2 回記録されるか、有効なキーによるクエリが失敗する可能性があります。hashisEqual

クラスに識別メンバーがある場合にhash/を実装する方法の簡単なサンプルを次に示します。isEqual

@interface RoleContainer : NSObject
@property (nonatomic, readonly) NSString *name;
- (NSUInteger)hash;
- (BOOL)isEqual:(id)anObject;
@end

@implementation RoleContainer
@synthesize name = _name;
- (NSUInteger)hash {
    return [name hash];
}

- (BOOL)isEqual:(id)anObject {
    if (![anObject isKindOfClass:[RoleContainer class]]) {
        return NO;
    }
    RoleContainer *other = (RoleContainer*)anObject;
    return [_name isEqual:[other name]];
}
@end
于 2012-07-10T20:10:06.100 に答える
1

試す

NSMutableDictionary * dict = [NSMutableDictionary dictionary];

また、あなたのを見てみるのも理にかなっていますClass。それはクラスで、getRole はクラスメソッドですか? それはオブジェクトですか?

于 2012-07-10T19:26:43.127 に答える
1

そのコードでは、 dict は nil になるため、メッセージを何も送信していません。それは実際に後で何かを指していますか?

RoleContainer が stringValue メソッドに応答すると仮定しています。これは、オーバーロードされている場合に何が起こっているかを調べるのに適した場所になる可能性があります。

標準の文字列値を使用している場合は、クラスとメモリの場所を返しています。後で誰かがオブジェクトをキーにリセットしている場合、これは信頼できないかもしれません。

また、getData オブジェクトが触れてはいけない場所で解放されているという問題が発生する場合もあります。デバッガーでNSZombieEnabledを有効 にするか、ARC を有効にしてみてください。

于 2012-07-10T19:50:15.723 に答える