改变财产类别

时间:2013-03-03 22:47:54

标签: ios objective-c ios6

请原谅编程术语的任何错误使用,我正在为我的问题寻找ios6解决方案:

我的头文件中有属性:

@property (nonatomic, strong) AClass *myExample;

但在我的.m文件中,我实际上可能希望_myExample为AClass,BClass或CClass。

_myExample = [[BClass alloc] init]; // incompatible pointer types

实施此

的最佳方式是什么?

2 个答案:

答案 0 :(得分:5)

您可能会将AClassBClassCCLass中的所有三个问题想象成一个协议,比如ICDoSomethingProtocol,然后声明属性为id <NSObject, ICDoSomethingProtocol> myExample而不是AClass *

您可以跳过协议,只需使用id <NSObject>,但您可以减少编译时检查。

答案 1 :(得分:1)

通常,您应该创建XClass并生成XClass的AClass,BClass和CClass子类。然后使用@property (nonatomic, strong) XClass *myExample;但是如果你是“懒惰”(这不是编程罪)你可以使用NSObject的预先退出类,或者只是将属性声明为@property (nonatomic, strong) id myExample;。 (请注意,没有*。)

在任何这些情况下,您需要(或至少可能应该)在使用它之前将该属性“强制转换”为正确的子类(除了调用超类的方法之外)。例如,int aValue = [(BClass*)self.myExample doSomeOperationOnBClass];

为了避免像这样抛出(以及相关的混淆),简单地为三个类声明单独的属性并不罕见,即使这三个类中的两个总是未使用。 (同样,懒惰不是编程罪。)