为什么要为app委托使用属性?

时间:2013-04-23 19:08:29

标签: ios objective-c

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

@property (nonatomic, unsafe_unretained) TheAppDelegate *appDelegate;

除了这种耦合的设计含义之外,appDelegate属性除了方便之外还有好处与检索应用代理相比:

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

5 个答案:

答案 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个位置)。如果你在几十个地方这样做,也许将它作为一个财产更有意义,但同样,这纯粹是为了方便。