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の結果にすぎませんか?
ありがとう。