我想向我的自定義對象添加一個便利構造函數。 類似於[NSArray arrayWithArray:]
如何編寫一個Objective-C的便利構造函數
我知道它涉及一個返回自動釋放對象的類方法。我一直在google搜索,但我似乎可以找到的一個方便的構造函數的定義,但不是如何寫一個。
我想向我的自定義對象添加一個便利構造函數。 類似於[NSArray arrayWithArray:]
如何編寫一個Objective-C的便利構造函數
我知道它涉及一個返回自動釋放對象的類方法。我一直在google搜索,但我似乎可以找到的一個方便的構造函數的定義,但不是如何寫一個。
比方說,你有以下幾種:
@class PotatoPeeler : NSObject
- (instancetype)initWithWidget: (Widget *)w;
@end
然後添加一個工廠方法,你就改成這樣:
@class PotatoPeeler : NSObject
+ (instancetype)potatoPeelerWithWidget: (Widget *)w;
- (instancetype)initWithWidget: (Widget *)w;
@end
以及實現,簡直是:
+ (instancetype)potatoPeelerWithWidget: (Widget *)w {
return [[[self alloc] initWithWidget: w] autorelease];
}
編輯:替換爲id
與instancetype
。它們在功能上是完全相同的,但後者爲編譯器提供了關於方法返回類型的更好的提示。
-(MYClass*) myInit{
self = [super init];
/* Your code */
return self;
}
假設你從NSObject派生你的類。
只要給它任何你想傳遞給構造函數的參數。
通常我的方法如下:首先我創建一個普通的初始化方法(實例方法),然後創建一個調用普通初始化方法的類方法。在我看來,Apple大部分時間都使用相同的方法。舉個例子:
@implementation SomeObject
@synthesize string = _string; // assuming there's an 'string' property in the header
- (id)initWithString:(NSString *)string
{
self = [super init];
if (self)
{
self.string = string;
}
return self;
}
+ (SomeObject *)someObjectWithString:(NSString *)string
{
return [[[SomeObject alloc] initWithString:string] autorelease];
}
- (void)dealloc
{
self.string = nil;
[super dealloc];
}
@end
+1注意使用'而不是self'硬編碼的類名來的alloc-初始化實例,以**手柄子類正確**('這裏self'指類對象本身)。還要注意返回類型'id':[「便利構造函數的返回類型是id,原因是它是初始化方法的id」](http://developer.apple.com/library/mac/documentation/Cocoa/概念/ ObjectiveC /章/ ocAllocInit.html#// apple_ref/doc/uid/TP30001163-CH22-SW12) – albertamg
@albertamg:沒錯。 :) –
希望谷歌索引它這次;) –