如何在init方法中访问超类的变量

时间:2013-05-18 09:37:51

标签: ios objective-c

超级班Resource

@interface Resource : CoderObject

@property (strong, nonatomic) NSString *resourceID;
@property (assign, nonatomic) ResourceType resourceType;
@property (assign, nonatomic) DataType dataType;

@end

子类ViewResource

@interface ViewResource : Resource

@property (strong, nonatomic) CustomView *view;
@property (strong, nonatomic) UIViewController *viewController;

@end

在子类ViewResource的{​​{1}}方法中,如何访问init的变量Resource?现在我想尝试使用dataType

还有其他方法吗?

2 个答案:

答案 0 :(得分:2)

您只需使用self.dataType即可。您的子类具有.h文件中定义的所有超类属性的完全可见性。使用self.xxx还可以在未来需要时覆盖访问者方法,而无需返回编辑所有使用代码。

查看下面的链接,足够公平。这些都是有效的。访问者不应该有副作用,但你不能保证他们不会。如果属性被定义为超类,那么您有几个选项:

  1. 使用self.xxx设置属性并尽力确保无副作用
  2. 在super上调用init方法,传递所需的参数,并在那里设置

答案 1 :(得分:0)

喜欢 Wain 在他的回答中说明你可以直接访问你的超级班级成员(如果他们不是私人的)。

只要你的init看起来像这样,在init方法中调用self.property没有问题

-(id)initAndTheNameYoWantAndMaybeSomeParameters:(NSString *)paramExample {
    self = [super initNameOfAnInitMethodFromSuperClass];
    //check if the init was with success
    if(self != nil) {
       self.myStringProp = paramExample;
       //or
       self.propertyFromSuper = paramExample;
    }
}

是的,你也可以在initMethods中做愚蠢的事情(我之前做过:)))就像从里面调用相同的initMethod那样生成一个崩溃我的应用程序的递归调用。 (很容易发现这个问题)