我曾尝试研究这个主题,但我一无所获,
假设我在 .h 中声明了一个属性,如下所示:
@property (strong, nonatomic) UIViewController *rootViewController;
然后在我的 .m 中说我已经像这样分配和初始化了:
self.rootViewController = [[MyCustomViewControllerClass alloc] initWithNibName:@"MyCustomViewControllerClass" bundle:nil];
这似乎可以正确编译和工作,但是我真的很好奇将属性类型声明为父类(super class) UIViewController,但将 Alloc 和初始化声明为 UIViewController MyCustomViewControlerClass 的子类意味着什么?
谢谢!
最佳答案
最终结果是您可以分配 UIViewController
的任何子类到该属性,因为 UIViewController
的任何子类将具有与基 UIViewController
相同的所有方法和属性,但是,Xcode 会提示您尝试访问的任何方法或属性不在基础上 UIViewController
.
在运行时,这不会成为问题,只要您实际分配给它的内容响应这些消息...但更好的编程建议您至少编写一个协议(protocol),其中包括这些方法/属性并将属性标记为符合该协议(protocol)。在这种情况下,您可以使用 @property NSObject<FooProtocol> *iVar;
Xcode 不会提示调用 FooProtocol
中的任何方法/属性,但如果它符合 FooProtocol
,它也只会让您将对象分配给该属性。 .
好的编程要求您以编译器甚至不标记警告的方式编写代码。它会迫使您代码的任何 future 维护者停下来挠头,弄清楚它是否应该修复(并且它是应该修复的东西)。
关于ios - Objective C 中的数据类型和声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21355124/