繁体   English   中英

在Objective-C继承中使用@ synthesize / @属性

[英]Use of @synthesize/@property in Objective-C inheritance

如果A类的实例var“foo”具有@ property / @ synthesize指令,而B类继承自A类,它是否还需要@ property / @ synthesize“foo”? 我问的原因是因为当我尝试使用B类的“foo”时,调用类说“foo”不是结构化联合或成员的东西,这让我相信它需要明确合成。

不,你没有。 合成属性会自动添加到A类及其子类中。

如果A类的实例var“foo”具有@ property / @ synthesize指令,而B类继承自A类,它是否还需要@ property / @ synthesize“foo”?

没有。

我问的原因是因为当我尝试使用B级的“foo”时,调用类说...

不,编译器说的。

......“foo”不是结构化联盟或成员,这让我相信它需要明确合成。

它是。 在A班

编译器给你这个警告,因为它不知道@property,这是因为你既没有声明它也没有导入声明它的头。 你说类A的头部声明了属性,所以将类A的头部导入到B类的实现中,以便编译器在编译B类时知道该属性。

以防这有助于某人。

我也遇到了这个问题并阅读了这些答案,仍然无法直接访问超类变量。 它们被声明为属性并在超类中合成,并且我已将标头导入到我的子类中。 我被困住了,直到我发现我需要在超类中的@interface部分声明成员变量以及超类的属性.... 例如

@interface BuoyAnnotation : NSObject <MKAnnotation>
{
    CLLocationCoordinate2D coordinate;
    CLLocation* location;
    int type; 

}

@property (nonatomic, readonly) CLLocationCoordinate2D coordinate;
@property (nonatomic, retain) CLLocation* location;
@property (nonatomic, assign) int type;

继承你的时候不需要重新声明任何属性或变量。

也许如果你发布你的ClassB头文件或一部分人,可以更好地查明你的问题。

更正,你只需在典型的成员变量声明大括号之外声明一个@property,然后@synthesize .m文件中的属性。 我注意到在子类中你使用self.propertyName来引用它,但是在父类中你可以使用即时变量名。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM