2014-07-08 43 views
0

我有一個自定義的NSObject數據結構,我想給不同的行爲。iOS NSString比較與Objective-C子類化

落實各項行爲,是它能更快

  1. 執行一個NSString比較每次(把這種情況X)這些行爲的一個可能發生(if ([obj.name isEqualToString:@"...A..."]) ... else if ([obj.name isEqualToString:@"...B..."]) ...然後針對不同的情況Y,只有包括對於應在情況Y.觸發(if ([obj.name isEqualToString:@"...C..."]) ... else if ([obj.name isEqualToString:@"...D..."]) ...

  2. 子類中的數據結構和覆蓋一個類的方法-(void) doThisAtPointX:..(inputs)..,並在所有點X,我需要的變量behav調用doThisAtPointX名字符串比較ior,而不是NSString比較?在這種方法中,默認實現將是NO-OP或空白調用,因此在某個調用中不會觸發的子類仍然會得到方法調用但不起作用,因爲調用例程不知道對象是否具有自定義行爲與否。因此,doThisAtPointX,doThisAtPointY,...將總是在每個對象的X,Y,Z處被調用,但是不是通過字符串比較來確定我的對象是否是需要反應的對象之一,而是依賴於子類指針在調用時執行NOOP或非NOOP行爲。

當然,即使是方法2,在某些時候我需要做一個字符串比較合適的子類指針賦值,但它一開始只是一個字符串比較,以獲得正確的自定義指針而不是每次觸發自定義行爲時進行多次比較。

對於這個問題的目的,我們可以考慮自定義行爲的數量(即字符串比較中方法1,或子類的數量方法2)是恆定的,徘徊在200 。自定義行爲的比較/可能檢查將在應用程序中每30秒發生一次。

+1

儘快將字符串轉換爲整數(枚舉),然後對其進行比較。 – trojanfoe

+1

已經_you_嘗試哪種方式更快?如果不是,爲什麼還沒有呢? – holex

+0

因爲實現200個子類需要很多時間。爲自己獲得明確答案的成本大約需要再花費兩週的時間。 – Cindeselia

回答

1

如果我理解正確的,我覺得這個問題是比較性能:

// SingleClass.m 

- (void)doSomething { 

    if ([self.someProperty isEqualToString:@"A"]) { 
     // behavior for A 
    } else if ([self.someProperty isEqualToString:@"B"]) { 
     // behavior for B 
    // and so on, 200 times 

// AbstractClass.m 

- (void)doSomething { 
} 

// SubclassA.m 

- (void)doSomething { 
    // behavior for A 
} 

// SubclassB.m 

- (void)doSomething { 
    // behavior for B 
} 

// and so on, 200 times 

第二種方法是更快。第二種方式是在創建差異化實例時完成巨大條件的工作。爲了測試這個,創建兩個方法,一個執行100個if-else字符串比較(平均大小寫),另一個不執行。我沒有運行這個測試,但我預測後一種方法運行時間會更短。

幾個意見:

  1. 這並不考慮參與建設維護200個小類與200分支條件的人的努力。
  2. 它也不認爲通過映射一個200分支字符串比較一個200 case switch語句做int比較可以獲得巨大的改進。
  3. 它也沒有考慮到在用戶感知方面,沒有選擇(每隔30秒完成一次數百個規模)就會變得重要。
  4. 另外值得指出的是,在子類方法中,更改someProperty(OP中的name)意味着變形實例。
+0

謝謝danh。對於方法2,我打算讓SubclassA和SubclassB與doSomethingAtX和doSomethingAtY(在某些子類中,doSomethingAtX可能根本不會被覆蓋,因爲它不會在X上執行任何操作),但是主代碼中有不同點子類執行,所以... – Cindeselia

+0

對於方法1,我根本沒有考慮創建一個類,而是想要創建一個類,而不是SubclassA,SubclassB,單獨的對象等,只需要一個NSString,執行,而不是在涉及的每個子類上調用doSomethingX,將NSString與僅可能的行爲進行比較。所以說SubclassA和SubclassC和Subclass Z全部覆蓋了doSomethingAtX,但是SubclassB和SubclassD覆蓋了doSomethingAtY。 – Cindeselia

+0

在方法1中,在沒有子類的情況下,無論何時在主代碼中出現情況X,我都有條件if([str isEqualToString:@「SubclassA」] || [str isEqualToString:@「SubclassC」] || [str isEqualToString:@ 「SubclassZ」])[self doSomething]。我在字符串方法中看到的最大優點是條件分支較少,因爲我預先消除了NO-OP,另一個優點是我不需要將所有這些變量輸入傳遞到子類方法中(doSomethingAtX/AtY use不同的輸入),因爲它寫得更高(主要)並且可以訪問更多變量/可以看到更多的系統等。 – Cindeselia