2014-01-22 84 views
2

以下哪項在iOS中會更高效或更快?以下哪一項在iOS中效率更高或更快?

/*公共靜態變量*/

static UICollectionView *mDocsCollection; 

@interface ClassA() 
{ 
} 
@end 

@implementation ClassA 

- (UICollectionView *)documentsCollection 
{ 
    if (!mDocsCollection) { 
     mDocsCollection = (UICollectionView *)[self.view viewWithTag:VIEW_TAG_DOCS_COLLECTION]; 
    } 
    return mDocsCollection; 
} 

@end 

/*接口變量*/

@interface ClassA() 
{ 
    UICollectionView *mDocsCollection; 
} 
@end 

@implementation ClassA 

- (UICollectionView *)documentsCollection 
{ 
    if (!mDocsCollection) { 
     mDocsCollection = (UICollectionView *)[self.view viewWithTag:VIEW_TAG_DOCS_COLLECTION]; 
    } 
    return mDocsCollection; 
} 

@end 

/*私人靜態變量*/

- (UICollectionView *)documentsCollection 
{ 
    static UICollectionView *docsCollection; 
    if (!docsCollection) { 
     docsCollection = (UICollectionView *)[self.view viewWithTag:VIEW_TAG_DOCS_COLLECTION]; 
    } 
    return docsCollection; 
} 

/*鑄字完成每次(不使用變量)*/

- (UICollectionView *)documentsCollection 
{ 
    return (UICollectionView *)[self.view viewWithTag:VIEW_TAG_DOCS_COLLECTION]; 
} 
+0

我不認爲這是一個有意義的區別...但是你可以通過定時檢查你的電話。 – Garoal

+0

我是iOS開發新手。你能指導我如何計時嗎? –

+2

我想人們在說的是,要學習的一件事就是確定什麼是重要的,哪些不重要。上述選項之間的相對速度將會太小而不必擔心,並且可以輕鬆進行測量。只有在用戶等待的情況下在循環內進行數千甚至數百萬次呼叫時,這種優化是否可能需要解決。 – drekka

回答

1

最後是最慢的。其他的同樣快,除了幾個機器指令之外可能只有幾個。

文件範圍的靜態和方法範圍的靜態做同樣的事情。伊娃做了非常不同的事情。如果您有多個ClassA或多個線程的實例,則這很重要,在這種情況下,靜態可能完全錯誤。

0

我懷疑在這種情況下可以觀察到不同之處,但是您可以對其進行基準測試並查看。頭腦簡單的基準會做這樣的事情:

CFAbsoluteTime startTime = CFAbsoluteTimeGetCurrent(); 

// put the code to benchmark here 

NSLog(@"elapsed = %f seconds", CFAbsoluteTimeGetCurrent() - startTime); 

您可能要重複測試多次,所以你建立你生成數字的置信水平。另請注意,測試它們的順序可能會影響結果,因此您可能需要延遲基準測試代碼,直到應用程序真正完成加載並靜音爲止。

從理論上講,如果調用此方法documentsCollection了很多,在變量存儲值可能提供一些性能改進,但你會用這種實現使用一些非常昂貴的方法時,或僅打擾你」重新呼籲它很多。如果有可能您不止一次地重新實例化ClassA(即關閉視圖控制器並稍後重新呈現它),那麼FYI,static實現可能會導致非常不同的行爲。對於ClassA這個實例,static變量不是唯一的,但是在實例中共享。鑑於你正在處理意見,我懷疑這種行爲是可取的。

+0

我建議你看看WWDC 2013視頻[設計性能代碼](https://daw.apple.com/cgi-bin/WebObjects/DSAuthWeb.woa/wa/login?path=%2F%2Fwwdc%2Fvideos %2Findex.php%3Fid%3D224&appIdKey = 891bd3417a7776362562d2197f89480a8547b108fd934911bcbea0110d07f757),這爲優化iOS代碼提供了很好的入門指導。 – Rob

2

隨着今天設備的速度,我懷疑會有任何可衡量的差異。但也有一些其他意見:

  1. 按照其他意見,它不是在這些情況下使用靜態變量是一個好主意。事實上,我建議只使用絕對必要的靜力學。

  2. 除非必要,否則我建議人們避免使用viewWithTag :.起初,這似乎是尋找控件的簡單解決方案。但是一旦你的項目變得更大或者其他程序員加入,這可能是導致錯誤發生的原因。我建議使用IBOutlets和/或UIView擴展,以便您可以直接訪問正確鍵入的控件始終指向您想要的控件的引用。

  3. ,並通過使用一個IBOutlet或財產,你根本就不需要任何的這些方法:)

+0

是的!以上所有方法都是醜陋而毫無意義的,它們的相對速度對於應用程序的運行根本沒有任何影響。使用一個屬性或實例變量,它就是_for_。 – jrturton

相關問題