【问题标题】:property inheritance: Auto property synthesis will not synthesize property属性继承:自动属性合成不会合成属性
【发布时间】:2014-08-25 13:44:19
【问题描述】:

摘要

这个问题是关于属性的继承以及从相互继承属性的类的内部和外部的不同读/写访问。

详情

我有一个类A 和另一个类B,它继承自A。在A 中声明了属性someProperty。我希望该属性在这些类之外是只读的,而从内部是读/写的。

只有一个类,这非常简单:您将.h 中的属性声明为只读,然后在类别内的.m 中再次将其声明为可读写。完成。

但是对于这两个类,一个派生自另一个,我在B 中收到以下编译器警告:

自动属性合成不会合成属性“someProperty” 因为它是“读写”,但它将通过“只读”合成 另一个属性

代码如下:

啊哈:

#import <Foundation/Foundation.h>

@interface A : NSObject

// This property shall be readonly from outside, but read/write from subclasses
@property (readonly) SInt32 someProperty;

@end

上午:

#import "A.h"

@implementation A
@end

B.h:

#import <Foundation/Foundation.h>
#import "A.h"

@interface B : A

@end

B.m:

#import "B.h"    

@interface B ()

// compiler warning in the following property declaration:
// /Users/.../B.m:12:41: Auto property synthesis will not synthesize property
// 'someProperty' because it is 'readwrite' but it will be synthesized
// 'readonly' via another property
@property (readwrite) SInt32 someProperty;

@end

@implementation B
@end

为什么会出现这个警告,我应该如何构建我的代码以避免它?

【问题讨论】:

    标签: objective-c inheritance properties


    【解决方案1】:

    您需要在所属类 (A) 上将该属性声明为可读写,然后在子类 (B) 上重新声明,以使编译器知道您想在那里使用它。因此,A 托管访问器方法,B 使用它。通常,您不希望 B 创建另一个访问器方法,因此您可以使用 @dynamic 告诉编译器超类(从技术上讲,只是另一个类)将提供实现。

    请注意,您还可以在A 上声明一个类别(不是扩展名),在B.m 中显式声明访问器方法(不使用属性,只是一个方法),因为这就是您的实际情况感兴趣(您实际上并不想要属性指定的任何其他内容,并且您并不真正想要确保属性属性在超类和子类中匹配的维护开销)...

    【讨论】:

    • 我不知道@dynamic。这就是我想要的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多