我在 Xcode 中尝试使用 TabBarController 模板做一些事情时遇到了这个“问题”(这不是一个真正的问题,我只是很惊讶这是可能的)。如果您使用没有故事板的模板,则基本设置如下所示:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
// Override point for customization after application launch.
UIViewController *viewController1 = [[FirstViewController alloc] initWithNibName:@"FirstViewController" bundle:nil];
UIViewController *viewController2 = [[SecondViewController alloc] initWithNibName:@"SecondViewController" bundle:nil];
self.tabBarController = [[UITabBarController alloc] init];
self.tabBarController.viewControllers = @[viewController1, viewController2];
self.window.rootViewController = self.tabBarController;
[self.window makeKeyAndVisible];
return YES;
}
tabBarController 的 viewControllers 属性是一个 NSArray。因此[self.tabBarController objectAtIndex:0]
返回一个id
.
所以我一直在想,如果我想调用我在 FirstViewController 类中声明的方法,我必须这样做:
FirstViewController *firstVC = (FirstViewController *)[self.tabBarController objectAtIndex:0];
[firstVC someMethod];
但事实证明,这是不必要的,编译器也会让我执行以下操作 - 只要我导入一个声明的头文件someMethod
(当然它不一定会增加可读性,但无论如何):
[[self.tabBarController objectAtIndex:0] someMethod];
我完全没想到会这样。所以我假设编译器将允许调用任何方法,id
只要该方法在当前类范围内的任何类中声明(我的意思是,它的头文件被导入到当前类中)。如果someMethod
未导入声明的类,编译器将抛出错误(但我必须补充一点,我在使用 ARC 时对此进行了测试。很有可能,编译器不会抱怨在id
何时调用“未导入”方法不使用ARC)...
这个假设正确吗?如果可能的话,您能否提供有关 id 类型的更多信息或参考?
或者编译器是否允许在 ARC 之前调用任何方法id
(是否导入),而现在对未导入方法的抱怨只是 ARC 的结果?
多谢。