我试图研究这个话题,但我没有提出任何建议,
假设我在我的.h中声明了一个属性:
@property (strong, nonatomic) UIViewController *rootViewController;
并且在我的.m中说我已经分配并且像这样:
self.rootViewController = [[MyCustomViewControllerClass alloc] initWithNibName:@"MyCustomViewControllerClass" bundle:nil];
这似乎是编译和正常工作,但我真的很好奇是什么意思是将属性类型声明为超类UIViewController,但Alloc和initing作为UIViewController的子类MyCustomViewControlerClass?
谢谢!
答案 0 :(得分:1)
这意味着Xcode将只为您自动完成UIViewController方法。在运行时,该对象仍然是MyCustomController。您的属性可以将其声明为NSObject或id,并且会发生相同的行为。
答案 1 :(得分:1)
最终结果是您可以将UIViewController
的任何子类分配给该属性,因为UIViewController
的任何子类将具有与基础UIViewController
相同的所有方法和属性,但是, Xcode会抱怨您尝试访问的任何方法或属性都不在基础UIViewController
上。
在运行时,这不会是一个问题,只要你实际分配给它的那些响应这些消息......但更好的编程表明,至少,你编写一个包含的协议那些方法/属性并将属性标记为符合该协议。在这种情况下,您可以使用@property NSObject<FooProtocol> *iVar;
并且Xcode不会抱怨调用FooProtocol
中的任何方法/属性,但它也只允许您将对象分配给该属性,如果它符合FooProtocol
。
良好的编程要求您以编译器甚至不标记警告的方式编写代码。它强制你的代码的任何未来维护者停下来,抓住他们的头,并弄清楚它是否应该被修复(并且它应该被修复)。