2014-03-19 79 views
0

在Objective-C(以及可可/ Cocoa Touch)中,對象有許多初始化程序似乎很常見。在其他語言中,我已經習慣了有一個地方,我可以覆蓋到影響對象初始化,但我看不出有什麼辦法避免類似下面的代碼:Objective-C公共對象初始化

- (void)commonInit 
{ 
    // Do stuff 
} 

- (id)init 
{ 
    self = [super init]; 
    if (self) [self commonInit]; 
    return self; 
} 

- (id)initWithCoder:(NSCoder *)aDecoder 
{ 
    self = [super initWithCoder:aDecoder]; 
    if (self) [self commonInit]; 
    return self; 
} 

- (id)initWithFrame:(CGRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    if (self) [self commonInit]; 
    return self; 
} 

(在這種情況下執行一些常規任務initilisation在UIView子類)。

有沒有更好的方法?希望有:被迫輸出每種方法是非常乏味的。

+1

不是;對我來說看起來不錯,除了我會製作'commonInit' * private *並使用一個前導下劃線來證明這一點。 – trojanfoe

+1

看起來不錯,但你也可以使用[The Designated Initializer](https://developer.apple.com/library/ios/documentation/general/conceptual/devpedia-cocoacore/MultipleInitializers.html) –

回答

0

您可以使用類別選項來執行此操作。

.h文件中

@interface UIImage (CommonInit) 
- (void)commonInit; 
@end 

.m文件

#import <QuartzCore/QuartzCore.h> 
#import "UIView+CommonInit.h" 

@implementation UIView (trans) 
- (void)commonInit; { 
    //... do your stuff 
} 
@end 

現在,它可以與你的代碼可能如下

- (id)initWithFrame:(CGRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    if (self) [self commonInit]; 
    return self; 
} 

只需導入在任何你想要的文件或如果你想盡一切辦法,只需將其導入YourProject-Prefix.pch文件。

+0

與製作'commonInit' * private * with'@interface MyClass()'。 – trojanfoe

+0

雅我用trojanfoe接受它。但他特別詢問了子類。那就是他可能比這個類的子類多。 – Mani

+0

由於'commonInit'是一個實現細節,所以API不應該是公共的。把它放到_private_類別來組織代碼是恕我直言,有點誇張。一個簡單的輔助方法也可以做到這一點。不過,我強烈建議不要將自定義標題放入pch文件!在pch文件中只有系統標題。僅在第三方庫的_rare cases_標題中,如果某些特定的訂單未被維護(例如,包括增強標題和基礎),如果存在令人討厭的微妙之處和衝突。 – CouchDeveloper