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,某些东西必须持有对每个对象的强引用或自动释放引用,否则它将被释放(正如警告所说)。因为stackbufis __unsafe_unretained,它不会为你而挂起ZBarSymbol

如果您创建一个临时自动释放变量并将您的对象存储在那里,它将一直存在,直到当前的自动释放池被弹出。然后,您可以stackbuf毫无怨言地指出它。

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