修复警告:无法将合成的setter / getter与用户定义的setter / getter配对

时间:2012-05-16 12:48:52

标签: ios networking httprequest compiler-warnings

我在我的应用程序QHTTPOperation.{h/m}中使用here所有工作正常但我收到了8条警告如下:

  

可写原子属性'acceptableStatusCodes'不能配对   使用用户定义的setter / getter合成setter / getter

     

可写原子属性'acceptableContentTypes'不能配对   使用用户定义的setter / getter合成setter / getter

     

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

     

...

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

有什么想法吗?

由于

2 个答案:

答案 0 :(得分:8)

声明属性nonatomic

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

答案 1 :(得分:1)

删除这些属性的@synthesize。他们提供了get / set。

编辑:为清楚起见。在.h中,他们用

声明可接受的状态代码
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"];
        }
    }
}

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

set消息正在使用

正确实现复制语义
 self->_acceptableStatusCodes = [newValue copy];

它释放旧值。它还会执行keyValue更改通知。我不知道为什么他们离开了合成 - 看起来他们可能想要稍后检查状态,并忘记删除自动生成的get / set。