gpt4 book ai didi

objective-c - 这个 objective-c 属性综合警告是什么意思?

转载 作者:太空狗 更新时间:2023-10-30 03:15:40 25 4
gpt4 key购买 nike

自升级到 Xcode 5.1 后,我开始在我的项目使用的某些代码中看到以下警告。我想弄清楚这意味着什么。

警告:自动属性合成不会合成属性“responseHeader”,因为它是“readwrite”,但它将通过另一个属性“readonly”合成

它发生的代码,在 .m 文件中:

@interface S3Response ()
@property (nonatomic, readwrite, retain) NSDictionary *responseHeader;
@end

属性的先前声明,在 .h 文件中:

@property (nonatomic, readonly) NSDictionary *responseHeader;

该属性没有@synthesize 语句,responseHeadersetResponseHeader 也没有定义为方法。然而,有一个名为 responseHeader 的 ivar 的明确定义。

对我来说似乎非常简单:属性被声明为对类的用户只读,但在本地可读写,以便类可以设置它。

这个警告是什么意思,我应该怎么做?

最佳答案

该代码似乎来自 AWS SDK for iOS ,S3ResponseAmazonServiceResponse 的子类。

公共(public) AmazonServiceResponse 接口(interface)定义了一个只读属性

@interface AmazonServiceResponse:NSObject
// ...
@property (nonatomic, readonly) NSDictionary *responseHeader;
@end

在实现文件的类扩展中重新定义为读写:

@interface AmazonServiceResponse ()
@property (nonatomic, readwrite, retain) NSDictionary *responseHeader;
@end

现在 子类 S3Response 也想要对该属性进行读写访问,因此也在其实现文件的类扩展中定义:

@interface S3Response ()
@property (nonatomic, readwrite, retain) NSDictionary *responseHeader;
@end

编译器提示是因为——在编译“S3Response.m”时——它不知道该属性的 setter 存在于父类(super class)中(它不读取那时父类(super class)的实现文件)。编译器也不能简单地在子类中合成一个setter,因为它不可能不知道属性由父类(super class)中的实例变量支持。

但是你知道会生成一个setter,所以你可以删除警告添加一个 @dynamic 声明到子类实现:

@implementation S3Response
@dynamic responseHeader;
...

@dynamic 是对编译器的“ promise ”,所有必要的访问器方法都将在运行时可用。

关于objective-c - 这个 objective-c 属性综合警告是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22443593/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com