2

我在我的应用程序中使用在这里QHTTPOperation.{h/m}发现一切正常,但我收到 8 个警告如下:

可写原子属性“acceptableStatusCodes”不能将合成的 setter/getter 与用户定义的 setter/getter 配对

可写原子属性“acceptableContentTypes”不能将合成的 setter/getter 与用户定义的 setter/getter 配对

可写原子属性 'authenticationDelegate' 无法将合成的 setter/getter 与用户定义的 setter/getter 配对

...

我问是因为我注意到在上述链接的项目中没有与QHTTPOperation.{h/m}.

任何的想法?

谢谢

4

2 回答 2

8

申报财产nonatomic

因为编译器不验证用户定义的访问器的实现是原子的还是非原子的,所以它假定它不是原子的。考虑到实际实现使用对象级自旋锁(在某些情况下),这是一个非常安全的假设,并且支持实现的数据是从我们那里抽象出来的。我们可以实现联系的唯一方法是使用编译器使用的(私有)运行时函数,然后编译器必须验证调用和参数在这种情况下是否正确。因此,用户定义的访问器不能保证满足标准的 objc 运行时原子合约。

于 2012-05-16T13:07:39.700 回答
1

删除@synthesize这些属性。他们提供了获取/设置。

编辑:为了清楚起见。在 .h 中,他们声明了可接受的StatusCodes

NSIndexSet *        _acceptableStatusCodes;

@property (copy,   readwrite) NSIndexSet *          acceptableStatusCodes;

然后,在 .m 中,他们有

@synthesize acceptableStatusCodes = _acceptableStatusCodes;

- (NSIndexSet *)acceptableStatusCodes
{
    return [[self->_acceptableStatusCodes retain] autorelease];
}

- (void)setAcceptableStatusCodes:(NSIndexSet *)newValue
{
    if (self.state != kQRunLoopOperationStateInited) {
        assert(NO);
    } else {
        if (newValue != self->_acceptableStatusCodes) {
            [self willChangeValueForKey:@"acceptableStatusCodes"];
            [self->_acceptableStatusCodes autorelease];
            self->_acceptableStatusCodes = [newValue copy];
            [self didChangeValueForKey:@"acceptableStatusCodes"];
        }
    }
}

这两个块(综合和消息实现)都定义了相同的消息,因此它们是冲突的。设置消息在开始时会额外检查自动生成的合成不会执行(检查 kQRunLoopOperationStateInited),所以我会删除合成,无论如何都会被忽略。

设置消息正确地实现了复制语义

 self->_acceptableStatusCodes = [newValue copy];

它释放了旧值。它还执行 keyValue 更改通知。我不知道他们为什么留在合成器中——看起来他们以后可能想要状态检查,却忘记删除自动生成的获取/设置。

于 2012-05-16T13:01:31.543 回答