我知道如果使用from:toViewController:
映射网址,则打开该网址会创建一个新的视图控制器,如果使用from:toSharedViewController
,则会使用共享实例。
但是例如
[map from:@"tt://tabbar/(initWithString:)" toSharedViewController:[MyTabbarController class]];
TTOpenURL(@"tt://tabbar/string");
这将调用与
类似的内容 [[MyTabbarController alloc] initWithString:@"string"]
但如果稍后调用TTOpenURL(@"tt://tabbar/somethingelse")
将会发生什么?
由于使用了共享对象,因此initWithString:
会在同一个实例上调用两次吗?
答案 0 :(得分:2)
答案是:不。即,不会在已初始化的实例上调用init,但会分配并初始化新实例。
这是因为Three20将对象与其完整URL相关联,在您的情况下是“tt:// tabbar / string”或“tt:// tabbar / somethingelse”,因此在查询{{1 ,没有找到现有的对象,将实例化一个新的对象。至少,从Three20 1.0.3开始就是如此。但我猜他们没有改变这一点。
在我看来,共享控制器机制将用于非常特殊的情况,例如设置视图,并且它不应该被认为是一种Three20实现的单例。每当我试图依靠这个来更加“巧妙”地使用TTURLMap时,我发现自己会回到非共享控制器。