目标C中的数据类型和声明

时间:2014-01-25 19:22:25

标签: ios objective-c

我试图研究这个话题,但我没有提出任何建议,

假设我在我的.h中声明了一个属性:

@property (strong, nonatomic) UIViewController *rootViewController;

并且在我的.m中说我已经分配并且像这样:

self.rootViewController = [[MyCustomViewControllerClass alloc] initWithNibName:@"MyCustomViewControllerClass" bundle:nil];

这似乎是编译和正常工作,但我真的很好奇是什么意思是将属性类型声明为超类UIViewController,但Alloc和initing作为UIViewController的子类MyCustomViewControlerClass?

谢谢!

2 个答案:

答案 0 :(得分:1)

这意味着Xcode将只为您自动完成UIViewController方法。在运行时,该对象仍然是MyCustomController。您的属性可以将其声明为NSObject或id,并且会发生相同的行为。

答案 1 :(得分:1)

最终结果是您可以将UIViewController的任何子类分配给该属性,因为UIViewController的任何子类将具有与基础UIViewController相同的所有方法和属性,但是, Xcode会抱怨您尝试访问的任何方法或属性都不在基础UIViewController上。

在运行时,这不会是一个问题,只要你实际分配给它的那些响应这些消息......但更好的编程表明,至少,你编写一个包含的协议那些方法/属性并将属性标记为符合该协议。在这种情况下,您可以使用@property NSObject<FooProtocol> *iVar;并且Xcode不会抱怨调用FooProtocol中的任何方法/属性,但它也只允许您将对象分配给该属性,如果它符合FooProtocol

良好的编程要求您以编译器甚至不标记警告的方式编写代码。它强制你的代码的任何未来维护者停下来,抓住他们的头,并弄清楚它是否应该被修复(并且它应该被修复)。