3

Objective-C コードを ARC に移行する際に、NSFastEnumeration プロトコルの実装に問題があります。次の警告を取り除く方法を教えてもらえますか (コード スニペットを参照)。前もって感謝します。

// I changed it due to ARC, was before
// - (NSUInteger) countByEnumeratingWithState: (NSFastEnumerationState*) state objects: (id*) stackbuf count: (NSUInteger) len
- (NSUInteger) countByEnumeratingWithState: (NSFastEnumerationState*) state objects: (__unsafe_unretained id *) stackbuf count: (NSUInteger) len
{
    ... 
    *stackbuf = [[ZBarSymbol alloc] initWithSymbol: sym]; //Warning: Assigning retained object to unsafe_unretained variable; object will be released after assignment
    ... 
}

- (id) initWithSymbol: (const zbar_symbol_t*) sym
{
    if(self = [super init]) {
        ... 
    }
    return(self);
}
4

1 に答える 1

5

ARC では、何かが各オブジェクトへの強力な参照または自動解放参照を保持する必要があります。そうしないと、(警告が示すように) 解放されます。stackbufですので、あなた__unsafe_unretainedのために にぶら下がるつもりはありませZBarSymbolん。

一時的な自動解放変数を作成してそこにオブジェクトをスタッシュすると、現在の自動解放プールがポップされるまで存続します。stackbufその後、文句なしにそれを指すことができます。

ZBarSymbol * __autoreleasing tmp = [[ZBarSymbol alloc] initWithSymbol: sym];
*stackbuf = tmp;
于 2013-01-24T19:18:30.260 に答える