2

設定しましNSZombieEnabled=YESた。次のコードを実行したい

- (NSString*) udid
{
    if (udid == nil) 
    {
        udid = [[UIDevice currentDevice] uniqueIdentifier];
        NSLog(@"UDID=%@", udid);
    }
    return udid;
}

udidが「リリース」されたとき、それはゾンビに置き換えられたことが判明しましたが、そうではありませんnil。だから私は何かをしたい

if (udid == nil || [udid isZombie])
{
    udid = [[UIDevice currentDevice] uniqueIdentifier];
    NSLog(@"UDID=%@", udid);
}

を試し[udid isKindOf:[NSZombie Class]]ましたが、NSZombie存在しません。udidでは、オブジェクトがゾンビであるとどのように判断できますか?

4

2 に答える 2

4

ゾンビへのメッセージはプログラムを停止します。

次のような副作用のないものを選択してくださいself

[udid self] // program will halt here if it's a zombie

ゾンビ狩りが無意味に思えるときのプログラムのデバッグまたは作成への他のアプローチ。つまり、ゾンビは適切に作成されたプログラムには存在せず、非常に特殊なデバッグのみの条件下でのみ存在します。

于 2011-05-31T05:21:37.310 に答える
3

オブジェクトが解放されたときに、オブジェクトへのポインターが nil に設定されることはありません。ポインターは、常に同じメモリ位置を指し続けます。ただし、その場所にあるものすべてが有効なオブジェクトであるとは限りません。そのため、ポインターが指すオブジェクトを解放した後は、ポインターを使用しないでください。そのポインターを引き続き使用する場合は、値を変更して、nil にするか、他の (有効な) オブジェクトを指すようにする必要があります。

NSZombieEnabled は、無効なオブジェクトにアクセスしているコード内の場所を見つけるのに役立つ単なるデバッグ ツールです。それを行っている場所を見つけた場合は、コードにバグが見つかったので、それを容認するのではなく、修正する必要があります。

コードを変更して、udid ポインターを解放したら適切に nil に設定します。

于 2011-05-31T05:14:58.610 に答える