【问题标题】:Property attribute in class extension does not match the primary class类扩展中的属性属性与主类不匹配
【发布时间】:2014-09-17 04:57:08
【问题描述】:

我正在实现 NSFilePresenter 协议:

@protocol NSFilePresenter <NSObject>
@required

@property (readonly, copy) NSURL *presentedItemURL;
@property (readonly, retain) NSOperationQueue *presentedItemOperationQueue;

@end

当然我也想访问presentedItemURLpresentedItemOperationQueue 内部写作。

所以我这样声明我的私有接口:

@interface MyClass () <NSFilePresenter>

@property (copy) NSURL *presentedItemURL;
@property (retain) NSOperationQueue *presentedItemOperationQueue;

@end

但是presentedItemURL 会返回一个警告:

'copy' attribute on property 'presentedItemURL' does not match the property inherited from 'NSFilePresenter'

我们可能会讨论这个警告在这里是否有意义。但我想要实现的只是在不编写自己的设置器、使用 KV 编码或任何其他技巧的情况下摆脱警告。 奇怪的是,编译器可以使用presentedItemOperationQueue

即使使用它也不能解决问题

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wall"
@property (copy) NSURL *presentedItemURL;
#pragma clang diagnostic pop

【问题讨论】:

  • 这是一个clang错误。如果您正在查看github.com/llvm-mirror/clang/blob/master/lib/Sema/… Sema::DiagnosePropertyMismatch 有一个检查是检查列表。第一个检查继承的属性是否是可读写的,而另一个不是。这将产生一个警告。第二个检查是两个属性是否都是copy。如果一个是而另一个不是,它将生成上述警告。但是 clang 无法确定您的属性会导致警告的属性。也没有办法抑制这个警告。

标签: ios objective-c warnings clang compiler-warnings


【解决方案1】:

我通过使用默认说明符(并且没有说明任何说明)解决了这个问题。以您为例:

@interface MyClass () <NSFilePresenter>

@property NSURL *presentedItemURL;
@property NSOperationQueue *presentedItemOperationQueue;

@end

在现代 Objective-C 中,这意味着 atomicstrong 引用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-10
    • 1970-01-01
    • 2011-06-06
    • 1970-01-01
    • 2021-10-15
    • 2014-09-18
    • 2013-12-22
    • 2020-03-28
    相关资源
    最近更新 更多