0

- (BOOL) isEqual:(id)objectカスタムクラスでオーバーライドしています。

__weak__strong__autoreleasing、の 4 つの選択肢のうち、メソッド シグネチャ__unsafe_unretainedのパラメーターで使用する必要があるのはどれですか?isEqual:

クラスのインスタンスを に追加しようとすると、メソッドの宣言で がNSMutableDictionary取得されるため、ここに問題があると考えています。EXC_BAD_ACCESS(code=2, address=0x10)

つまり、デバッガーが取得する行EXC_BAD_ACCESSは次のとおりです。

- (BOOL) isEqual:(id __strong)object {

メソッド本体のいずれかが実行される前。

4

2 に答える 2

1

正解は、コメントの @Dustin Rowland によると、「アクセスが悪い場合は、そこにあると思われるものが含まれていない領域を読み書きしようとしています。」 でした。

于 2012-07-13T16:42:25.273 に答える
0

デフォルトでは、ARC は を使用します__strong。これは、引数がメソッド内で使用されている間、retain/release を介して保持されることを意味します。につながるにEXC_BAD_ACCESSは、オブジェクト (引数自体、またはisEqual:実装内のメソッド呼び出しで使用されるその他のオブジェクト) にアクセスするときに過剰解放する必要があります。これは、修飾子を変更しても修正できません。

補足: ただし、修飾子を変更すると何かが変わることを期待して注意してください。コンパイラの最適化により、一部の呼び出しをスキップしても安全であると判断される場合があります。たとえば、次のコードをファイルに追加し、アセンブリ ([製品] -> [出力の生成] -> [アセンブリ ファイル]) を見てアーカイブ (-Os を使用) します。

- (void)logObject:(id)o
{
    NSLog(@"%@", o);
}

- (void)call
{
    id o = [[NSObject alloc] init];
    [self logObject:o];
}

のパラメータlogObject:はデフォルトです__strongが、アセンブリ出力では保持/解放は行われません。のパラメーター-logObject:__strong__weak__unsafe_unretainedまたはに変更すると、__autoreleasingまったく同じアセンブリ出力が得られます。ただし、行を複製するとNSLog、異なる型修飾子のアセンブリ コードが変更されます。

于 2012-07-11T16:40:41.823 に答える