将AppDelegate作为UIViewController
中的实例变量是否可以?与@property (nonatomic, weak) AppDelegate *appDelegate;
为什么我要问是因为我需要经常访问它而不是这样做:
AppDelegate *appDelegate = (AppDelegate *) [[UIApplication sharedApplication] delegate];
[appDelegate doSomething];
我能做到:
[appDelegate doSomething]
答案 0 :(得分:18)
也许可以。
但我最喜欢的解决方案如下。
在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/
希望它有所帮助。
答案 1 :(得分:13)
或者你可以做到
-(YourAppDelegate*) app
{
return (YourAppDelegate*) [[UIApplication sharedApplication] delegate];
}
在UIViewController的子类中 - 然后将其作为所有视图控制器的基类。
然后,[self app]
有效,您无需保留参考。
我这样做是为了保留一些常见的简单实用程序 - 您也可以使用类别执行此操作。
答案 2 :(得分:4)
通过完整表达式访问委托与使用(非原子,弱)属性访问委托之间的区别是任意的。当然,如果要经常调用它,可以通过定义属性来保存自己的代码行。
然而,问题提出了一个可能的封装问题的更大问题。最佳做法表明,呼叫沿着层次结构而不是向上。当然,app委托是一个特例,但我的建议仍然是考虑从app委托中隔离你需要的任何资源的可能方法,并将这些引用传递给你的视图控制器层次结构,因为该层次结构是创建