类扩展中的属性属性与主类不匹配

4

我正在实现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'

我们可能会讨论这个警告是否有意义。但我想要的只是在不编写自己的setter、使用KV编码或任何其他技巧的情况下消除这个警告。 奇怪的是,编译器对于 presentedItemOperationQueue 是没有问题的。 即使使用这个也无法解决问题。
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wall"
@property (copy) NSURL *presentedItemURL;
#pragma clang diagnostic pop

1
这是一个clang的bug。如果你正在查看https://github.com/llvm-mirror/clang/blob/master/lib/Sema/SemaObjCProperty.cpp#L1301 Sema::DiagnosePropertyMismatch,那么有一系列检查。第一个检查是检查继承的属性是否为readwrite,而另一个则不是。这将生成一个警告。 第二个检查是如果两个属性都是“copy”。如果其中一个是,而另一个不是,则会生成上述警告。但是clang无法确定您的属性的属性,这将导致警告。此外,没有方法可以抑制此警告。 - McZonk
1个回答

0

我通过使用默认的格式说明符(而不是指定任何一个)来解决了这个问题。对于你的例子:

@interface MyClass () <NSFilePresenter>

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

@end

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接