1

Core Foundation オブジェクト、具体的には CFHTTPMessageRef を保持するプロパティがあります。attribute ((NSObject)) マクロを使用して、参照されたオブジェクトを通常の NSObject として扱い、自分でCFReleaseするのではなく、そのオブジェクトの保持と解放を処理するようにコンパイラに指示してみました。プロパティをstrongではなくweakに変更しようとしましたが、何も機能していないようです.静的アナライザーはまだメモリリークがあることを示しており、CFGetRetainCountからの出力の外観から、それは正しい. 私のプロパティがメモリリークを引き起こす理由を誰かが知っていますか:

typedef __attribute__((NSObject)) CFHTTPMessageRef HTTPMessageRef;

@interface ABRemoteConnection : NSObject
@property (strong) HTTPMessageRef message;
@end

- (void)dataReceived:(NSNotification *)notification {
    self.message = CFHTTPMessageCreateEmpty(kCFAllocatorDefault, TRUE);

    // do some stuff and if the message is complete, use it and release the 
    // message object
    if (messageIsComplete(self.message)) {
         self.message = NULL;
    }
}
4

1 に答える 1

1

ドキュメントから、__attribute__((NSObject))は でのみ使用することを意図しているようですretain

しかし、に切り替えるということは、小道具が管理する別の参照を追加していることstrongretain意味します。あなたがしなければならない元の参照がまだありますCFRelease

考えてみれば、これは理にかなっている。で同じことをすることを想像してみてくださいproperty(retain) NSObject *:

- (void)dataReceived:(NSNotification *)notification {
    self.o = [[NSObject alloc] init];
}

これは問題なく動作しますが、これは ARC が を認識し、対応するをスコープの最後にalloc自動的に挿入するためです。release関数ではCF___Create、スコープの最後に自動 CFRelease がないため、手動で作成する必要があります。

HTTPMessageRefと同じくらい便利になりたい場合はNSDictionary、単に typedef にすることはできません。無料のブリッジ クラスである必要があります。

于 2012-11-03T00:34:25.137 に答える