2012-02-10 56 views
10

UIViewController中将AppDelegate作为实例变量可以吗?像@property (nonatomic, weak) AppDelegate *appDelegate;iOS - AppDelegate作为实例变量?

为什么我问的是,因为我需要经常访问它,而不是做的:

AppDelegate *appDelegate = (AppDelegate *) [[UIApplication sharedApplication] delegate]; 

[appDelegate doSomething]; 

我可以这样做:

[appDelegate doSomething]

+2

如果你经常访问它,为什么不把它移到其他地方? – Osiris 2012-02-10 16:20:00

回答

12

或者你可以做

-(YourAppDelegate*) app 
{ 
    return (YourAppDelegate*) [[UIApplication sharedApplication] delegate]; 
} 

在的UIViewController的一个子类 - 然后使该基类的所有视图控制器的。

然后,[self app]作品,您不必保持一个参考。

我这样做是为了保留一些常用的简单实用程序有 - 你也可以与类别做到这一点。

4

的区别访问之间通过完全表达与(非原子,弱)属性进行委托是任意的。当然,如果你打算频繁地调用它,通过定义一个属性来保存自己的代码行。

的问题提出了一个可能的封装问题的一个更大的问题,但是。最佳实践表明,呼叫沿着层次结构向上延伸。当然,应用程序委托有点特殊,但我的建议仍然是考虑从应用程序委托中分离出所需资源的可能方式,并将这些引用传递到视图控制器层次结构中,因为该层次结构是创建。

16

也许它可以。

但我最喜欢的解决方案如下。

在你AppDelegate.h

+ (AppDelegate *)appDelegate; 

在你AppDelegate.m

+ (AppDelegate *)appDelegate 
{ 
    return (AppDelegate *)[[UIApplication sharedApplication] delegate]; 
} 

然后使用任何你想要的:

AppDelegate* sharedDelegate = [AppDelegate appDelegate]; 

一些注意事项:

如果您使用AppDelegate共享数据,您可以阅读singletons-appdelegates-and-top-level.html

如果你使用AppDelegate您的逻辑应用程序的工作流程,你可以阅读handling-your-initial-view-controllers-for-iphone/

希望它能帮助。

+0

'getAppDelegate'违反了苹果公司的[命名规则](http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CodingGuidelines/Articles/NamingMethods.html#//apple_ref/doc/uid/20001282- BCIGIJJF)。更好的名字是'+(AppDelegate *)appDelegate;'或'+(AppDelegate *)sharedAppDelegate;' – 2013-03-01 15:44:12

+0

@AlexPretzlav感谢您的编辑。 – 2013-03-01 17:25:19