2013-04-23 78 views
4

我審計有一個appDelegate性能在許多視圖控制器的一些代碼。爲什麼使用應用程序委託的屬性?

@property (nonatomic, unsafe_unretained) TheAppDelegate *appDelegate; 

撇開這種耦合的設計的影響,是否有任何益處,比便利其它,一個appDelegate屬性的與檢索應用程序委託:

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

這是都非常主觀的,所以我給你我的觀點:AppDelegate中的任何類用途或功能不縮小系統和應用程序是一個代碼味道。有一個屬性引用它是雙重的。我覺得獲得它的醜陋方式本身就是一種沮喪(就像C++中的各種投射方法一樣)。在這兩種情況下都沒有任何好處(一種是強制你記住設置或定義一個屬性,另一個強制冗長)。 – CodaFi 2013-04-23 19:11:25

+0

@CodaFi,有沒有辦法縮小這個問題,所以它不是*非常主觀*?我主要好奇的是,如果我*必須*使用這樣的代碼,我的財產更好。 – 2013-04-23 19:14:56

+0

這是一個主觀因素,它是一個編碼風格的問題,而不是一個關於具體數字的問題。您可能會收到的唯一答案是意見和經驗。我可以給你一百萬個案例,我曾經在某些案例中親自使用過一個或另一個案例,但這絕不會構成權威性的答案。 – CodaFi 2013-04-23 19:18:28

回答

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知道。在類實現中使用單例完全隱藏了這個事實。

但如果有在您的應用程序多臺控制器依賴於應用程序的委託,它可能只是一個設計缺陷。

+0

對一般財產有意義。但是,我什麼時候會嘲笑'appDelegate'? – 2013-04-23 19:17:54

+0

也許測試應用程序代表發佈的一些通知?只是猜測。無論如何,在您的應用程序中很有可能這個屬性真的沒有意義。 – zoul 2013-04-23 19:21:37

+0

@JasonMcCreary:一個明顯的答案是單元測試你的類與應用程序委託的交互(例如它在特定時間向委託發送某些消息)。 – Chuck 2013-04-23 19:43:26

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 
1

我更喜歡使用宏,而不是在每一個viewcontrollers定義一個屬性 像

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

在constants.h定義這個,它包括在.PCH文件中的標題,我可以有這個appDelegate在我的代碼中的任何類。

+0

不知道在我的代碼中到處都有'appDelegate',但是不錯的選擇。 – 2013-04-23 19:52:51

+0

只是意味着在項目中的任何類:) – 2013-04-23 20:01:49

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這樣的事情,你會經常需要,但不一定在一個類中「活」,(你不需要每個實例都有一個,但可以應用於多個實例)或引用一些特定的狀態,如「全球應用字號」

1

我不認爲這是主觀的。現在的問題是:

有什麼好處,比其他方便的,一個的appDelegate 財產與檢索應用程序的委託

而且我認爲答案是「不」。除了方便之外,沒有任何好處。

理想情況下,你有你的應用程序委託和視圖控制器,因此該方法與使用應該沒有太大的問題,任何(或最少)的耦合。在我現在正在開發的項目中,我只是在需要時檢索委託(在整個代碼庫中只有2個位置)。如果你在幾十個地方這樣做,也許將它作爲一個屬性更有意義,但同樣,這純粹是爲了方便。