0

次のコードをテストしました。

// Employee.h
@interface Employee : NSObject
@end

// Employee.m
@implement Employee
@end

// main.m
int main() {
    NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
    Employee* john = [[Employee alloc] init];

    void (^print)(void) = ^{
        NSLog(@"employee = %@", john);
    }

    [john release];
    [pool release];
    return 0;
}

楽器を使用してジョンの参照カウントを追跡しましたが、ジョンの参照カウントは印刷ブロックで増加していないようです。

ジョンをキャプチャして印刷ブロックに保持する必要があると思いました。

私は何を誤解していますか?

4

1 に答える 1

1

ここのブロックはスタックベースのブロックです。スタックベースのブロックは、ローカル コンテキストを保持しません。

johnブロックがヒープにコピーされるときに保持されます (を呼び出すことによって、またはコピーしたブロックのいずれか[print copy]が必要であることを忘れないでください)。releaseautorelease

ARC は、ブロックをいつコピーして解放する必要があるかを認識しており、必要に応じてそれを処理します。ブロックを扱う作業がずっと楽になります。


編集

代わりにこれを試してください:

void (^print)(void) = [^{
        NSLog(@"employee = %@", john);
    } copy];

...

[print release];
于 2012-07-19T08:33:56.373 に答える