4

appDelegate我正在审核一些在许多视图控制器中具有属性的代码。

@property (nonatomic, unsafe_unretained) TheAppDelegate *appDelegate;

撇开这种耦合的设计含义不谈,除了方便之外,属性与检索应用程序委托有什么好处:appDelegate

TheAppDelegate *appDelegate = (TheAppDelegate *)[[UIApplication sharedApplication] delegate];
[appDelegate someMethod];
4

5 回答 5

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,您可以知道对象的状态或行为取决于应用程序委托。在类实现中使用单例完全隐藏了这个事实。

但如果你的应用中有很多控制器依赖于应用委托,那可能只是设计缺陷。

于 2013-04-23T19:13:28.290 回答
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
于 2013-04-23T19:30:43.480 回答
1

我认为这根本不是主观的。问题是:

除了方便之外,appDelegate 属性与检索应用委托相比有什么好处吗

我认为答案是“不”。除了方便,没有任何好处。

理想情况下,您的应用程序委托和视图控制器之间没有(或最小)耦合,因此您使用哪种方法应该无关紧要。在我现在正在进行的项目中,我只是在需要时检索委托(在整个代码库中只有 2 个位置)。如果你在几十个地方这样做,也许将它作为一个属性更有意义,但同样,这纯粹是为了方便。

于 2013-04-23T21:19:19.813 回答
1

我更喜欢使用宏而不是在每个视图控制器中定义一个属性,例如

#define appDelegate ((MYAppDelegate *)[[UIApplication sharedApplication] delegate])

在 constants.h 中定义它并包括 .pch 文件中的标头,我可以appDelegate 在我的代码中的任何类中使用它。

于 2013-04-23T19:47:43.310 回答
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 之类的东西,你经常需要,但不一定在一个类中“活”,(你不需要每个实例都需要一个,但可以应用于多个实例),或引用某些特定状态,比如“全局应用字体大小”

于 2013-04-23T20:32:07.833 回答