0

SenTest から行われた呼び出し内でこのコードを実行するとSTAssertThrowsSpecificNamed:

@throw [[NSException alloc] initWithName:NSInvalidArchiveOperationException
                                  reason:@"---some reason----"
                               userInfo:nil];

私は(でNSZombieEnabled=YES)得ます:

*** -[NSException reason]: message sent to deallocated instance 0x100a81d60

例外は、STAssertThrowsSpecificNamed処理が完了する前に何らかの方法で割り当て解除されます。

@throw上記の行を次のコードに置き換えることで、エラーを回避できます。

NSException *exception = [NSException exceptionWithName:NSInvalidArchiveOperationException
                                                 reason:@"---some reason----"
                                               userInfo:nil];
@throw exception;

ARC の有無にかかわらず、まったく同じ動作が得られます。ARC がなければ、このコードもエラーを回避します。

@throw [[[NSException alloc] initWithName:NSInvalidArchiveOperationException
                                   reason:@"---some reason----"
                                userInfo:nil] retain];

これは SenTest のバグですか? それともコンパイラのバグ?それとも私の最初は@throw間違っていますか?

4

3 に答える 3

2

@throwは、オブジェクトの使用が終了した後にオブジェクトを解放するため、@ throwと同じ行にオブジェクトを含める場合は、-retainを使用します。

@throw [[[[NSException alloc] initWithName:NSInvalidArchiveOperationException
                                  reason:@"---some reason----"
                               userInfo:nil] retain] autorelease];

これでうまくいくはずです。

編集:ARC固有のコードを確認するには、次を使用します。

if(__has_feature(objc_arc)) {
    @throw [[[NSException alloc] initWithName:NSInvalidArchiveOperationException
                                       reason:@"---some reason----"
                                     userInfo:nil];
} else {
    @throw [[[[NSException alloc] initWithName:NSInvalidArchiveOperationException
                                      reason:@"---some reason----"
                                   userInfo:nil] retain] autorelease];
}
于 2012-03-06T04:40:03.040 に答える
1

今のところ、このフォームに固執しています。これは、ARC の有無にかかわらず機能するようです。

id exc = [NSException exceptionWithName:NSInvalidArchiveOperationException
                                 reason:@"---some reason----"
                               userInfo:nil];
@throw exc;

Galaxas0 の回答による@throwと、処理後に例外を解放するように設計されています。特にARCの下では、これはまだ奇妙に思えます。

ARC 以外のプロジェクトでは、これを使用します (これも Galaxas0 ごとに):

@throw [[[[NSException alloc] initWithName:NSInvalidArchiveOperationException
                                    reason:@"---some reason----"
                                  userInfo:nil] retain] autorelease];
于 2012-03-08T19:11:35.063 に答える
1

私は現在+[NSException raise:format:]、ARC と手動の保持と解放の両方で独占的に使用しています。

于 2013-05-18T04:21:56.273 に答える