我正在审核一些在许多视图控制器中具有appDelegate
属性的代码。
@property (nonatomic, unsafe_unretained) TheAppDelegate *appDelegate;
除了这种耦合的设计含义之外,appDelegate
属性除了方便之外还有好处与检索应用代理相比:
TheAppDelegate *appDelegate = (TheAppDelegate *)[[UIApplication sharedApplication] delegate];
[appDelegate someMethod];
答案 0 :(得分:3)
我有时也这样做,即。声明可以使用单例访问方法获取的依赖项的属性:
@class Foo : NSObject
@property(strong) NSNotificationCenter *notificationCenter;
@end
@implementation Foo
- (id) init
{
self = [super init];
[self setNotificationCenter:[NSNotificationCenter defaultCenter]];
return self;
}
@end
优点是您可以在依赖项上获得更松散的耦合。例如,您可以轻松提供自己的模拟实例。在某些情况下,它还会缩短代码,编写_notificationCenter
而不是[NSNotificationCenter defaultCenter]
。
我能想到的第三个原因是声明属性使依赖项显式化:通过查看公共API,您知道对象的状态或行为取决于app委托。在类实现中使用单例完全隐藏了这一事实。
但是如果你的应用中有很多控制器依赖于app代理,那可能只是设计缺陷。
答案 1 :(得分:2)
以框架方式回答问题。
具体的好处是: -
清洁代码 - 属性设置一次(可以只读)。 如果你不止一次使用它
self.appDelegate比每次从共享应用程序中获取appDelegate更简单。 (更简单更好)
可能存在较小的效率优势(尽管这绝对是过早的优化,并且可能不存在,具体取决于编译器)。
我不得不同意CodaFi它有点臭,所以有创造一些语法糖的中间地带来隐藏一些复杂性。
@class MyAppDelegate;
@interface MySharedAppDelegate : NSObject
+ (MyAppDelegate*) appDelegate;
@end
#include "MyAppDelegate.h"
@implementation MySharedAppDelegate
+ ( MyAppDelegate*) appDelegate {
return (MyAppDelegate*)[UIApplication sharedApplication].appDelegate;
}
@end
答案 2 :(得分:1)
我更喜欢使用宏而不是在每个viewcontrollers中定义属性 像
#define appDelegate ((MYAppDelegate *)[[UIApplication sharedApplication] delegate])
在constants.h中定义它并在.pch文件中包含标题,我可以在我的代码中的任何类中使用此appDelegate
。
答案 3 :(得分:1)
我喜欢这样做:
//in .pch file
#import "Includes.h"
//in Includes.h
#import "AppDelegate.h"
#define APPDELEGATE() (AppDelegate *)[[UIApplication sharedApplication]delegate]
然后我需要向appDelegate询问我刚刚说的话
[APPDELEGATE() someMethod];
在其他地方拥有AppDelegate的属性似乎是一个坏主意。不能说为什么,除了已经有一个简单的方法获得该引用(sharedApplication)。
在这种情况下,它可能只是为了方便开发人员。我不得不说,“需要”在任何地方引用AppDelegate可能更多的是意大利面条代码和错误封装的指标。
*顺便说一句,我在appDelegate中存储对一些“全局”变量的引用,这也可能是封装不良的指示...这就是为什么我首先使用APPDELEGATE()声明;-)
**像NSDateFormatter这样的东西,你经常需要但不一定“活”在一个类中,(你不需要为每个实例使用一个,但可以应用于多个实例),或者引用一些特定状态,如“全局应用程序字体大小”
答案 4 :(得分:1)
我认为这根本不是主观的。问题是:
appDelegate除了方便之外还有什么好处 属性与检索应用程序代理
我认为答案是“不”。除了方便之外没有任何好处。
理想情况下,您的应用委托和视图控制器之间没有(或最小)耦合,因此您使用哪种方法不应该太重要。在我正在进行的项目中,我只是在需要时检索委托(在整个代码库中只有2个位置)。如果你在几十个地方这样做,也许将它作为一个财产更有意义,但同样,这纯粹是为了方便。