2013-05-19 74 views
3

考慮到下面的Objective-C例子,它僅僅是一種風格和易讀性的問題,可以保留單獨的語句或將它們捆綁在一起?是否有任何實際的好處?宣佈單個變量是否浪費內存?將聲明合併爲一個聲明還是不合並?

NSDictionary *theDict = [anObject methodToCreateDictionary]; 
NSArray *theValues = [theDict allValues]; 
NSString *theResult = [theArray componentsJoinedByString:@" "]; 

NSString *theResult = [[[anObject methodToCreateDictionary] theValues] componentsJoinedByString:@" "]; 

回答

2

我採取以下考慮,當我宣佈一個獨立的變量:

  • 如果我可能希望看到在調試器的價值。
  • 如果我正在訪問變量不止一次。
  • 如果這條線太長。

然而,這兩種方法之間沒有實際的區別。

+0

感謝您的澄清。 – tomchkk

1

此外,你還沒有被直接問這個,但是要知道,當你訪問使用點符號的對象,例如:

myObject.myObjectProperty1.myObjectProperty1Property; 

如果你要訪問一次myObjectProperty1Property多,它可以建議將其分配給本地命名變量。如果你不這樣做,查找將會被執行多次。

現在我不能強調,對於許多情況(如果不是大多數情況下),這次節省是非常小的,以至於認真地質疑是否值得花時間爲分配額外打字!那麼,爲什麼我要提高呢?因爲除了風格的「非凡」之外(我剛剛寫了一個新單詞) - 如果你正在編寫的代碼段正在緊密循環運行,那麼值得特別注意。一個例子是編寫代碼時,它將單元填充到包含大量單元的UICollectionView中。此外,如果您使用的是核心數據,並且您正在使用點符號來引用NSManagedObject屬性的屬性,那麼每次查找都會產生更大的開銷,在這種情況下,更值得花時間先將「嵌套」點符號調用引用的任何值先分配給局部變量。

+0

感謝您的貢獻。我明白了你的觀點,但我想知道,在給定這種情況下,花時間爲具有或不帶點表示法的局部變量分配一個值是否是同樣的事情? – tomchkk

+0

不,因爲在目標C中,ivar通過對象消息傳遞進行訪問。您可以定義任何iVar訪問方法,以包含您喜歡的任何功能,並且編譯器事先並不知道是否需要運行您的方法,因此在目標c中,點符號對應於嵌套方法調用,並使用ivar訪問方法每個點。對於任何給定的代碼,更少的點等於更少的消息。有人推測,對於某些代碼模式,理論上這可以通過編譯器進行優化。實際上,無論出於何種原因,似乎都不是。 – TheBasicMind