【问题标题】:Fix warning: cannot pair a synthesized setter/getter with a user defined setter/getter修复警告:无法将合成的 setter/getter 与用户定义的 setter/getter 配对
【发布时间】:2012-05-16 12:48:52
【问题描述】:

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

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

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

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

...

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

有什么想法吗?

谢谢

【问题讨论】:

    标签: ios networking httprequest compiler-warnings


    【解决方案1】:

    声明属性nonatomic

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

    【讨论】:

    • 我很想知道为什么这可以解决有两个 get/sets 的问题。
    • @LouFranco 因为如果我删除 '@synthesize' 我会收到另一个警告 '@property' 需要 '@synthesize',所以如果我删除所有的 self。可接受的StatusCodes 将是错误
    【解决方案2】:

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

    编辑:为清楚起见。在 .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 更改通知。我不知道他们为什么留在合成器中——看起来他们可能想要稍后进行状态检查,但忘记删除自动生成的 get/set。

    【讨论】:

    • 这可能是致命的,如果属性是用其他属性定义的,比如 retain...
    • 如果你看一下代码,他们声明它是复制的,而他们提供的 setter 正确地复制了。
    猜你喜欢
    • 2011-03-14
    • 2023-03-29
    • 2011-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-20
    • 2017-02-26
    • 1970-01-01
    相关资源
    最近更新 更多