2013-05-14 33 views
0

下面有兩種編程方式來編程allocinit各種類和'類型'的對象。
Objective-C中編程對象的創建

- (id)buildObjectOfClass:(NSString *)classString andType:(NSString *)typeString 
    { 
    id buildObject; 
    Class className    = NSClassFromString(classString); 
    SEL initWithTypeSelector = NSSelectorFromString(@"initWithType:"); 

    if ([className instancesRespondToSelector:initWithTypeSelector] == YES) { 
     buildObject = [[className alloc] performSelector:initWithTypeSelector 
               withObject: typeString]; 
    } 
    return buildObject; 
} 

這種方法實現最初編寫更簡潔的簡單:
{ return [[className alloc] initWithType:typeString]; }

我的問題是:1)是必要的詳細的版本? 2)如果是這樣,它是否被編程爲儘可能最好?我忽略了哪些捷徑或最佳實踐?

+1

你能解釋一下這個*爲什麼嗎?我無法想象我會想要做這件事的一個例子。你通過從字符串構建類和選擇器來打開自己的大量錯誤/崩潰。 – 2013-05-14 16:30:11

回答

2

該方法的詳細版本與簡潔版本之間的區別在於,詳細版本驗證類實例實際上可以響應-initWithType:,這不是標準NSObject初始化函數。

沒有必要使用詳細的版本如有以下是真實的:

  • 你只使用-init而不是-initWithType:
  • 你確信你每次實例化類將能夠處理-initWithType:
  • 你不介意與未知方法例外意外退出應用程序,如果你實例化類並不-initWithType:
迴應

此版本(儘管您應該將buildObject設置爲零以明確處理錯誤情況)如果未找到該類或者它不響應-initWithType:,則返回nil。如果找不到該類,則簡化版本會返回nil,如果類實例不響應-initWithType:,則會引發異常。

+0

當在ARC下編譯時,只有'respondsToSelector:'檢查失敗_only_時,long版本返回'nil'。否則它會返回垃圾。 – 2013-05-14 18:25:57

+0

@JoshCaswell我相信我在最後一段的開頭提到了這個事實。 – gaige 2013-05-14 18:48:26

+0

我直接回復。那句話對我來說就好像你在說'如果實例不響應'initWithType:','buildObject'將始終爲'nil'。如果ARC未啓用,則不是這樣。 – 2013-05-14 18:51:12