2012-03-16 18 views
0

在存儲器和計算時間方面,是它更好地轉換爲int值:目標C語法鑄造的NSNumber到int

int thisLetterInt = (int)[(NSNumber *)[levelSavedSolutionArrayFIX objectAtIndex:i] intValue]; 

int thisLetterInt = [[levelSavedSolutionArrayFIX objectAtIndex:i] intValue]; 

或者是完全一樣的?

此外,我不負責任何情況下發布的權利?

回答

6

轉換是不必要的,你只是在程序編譯期間浪費硬盤空間和CPU週期。

即使啓用ARC,編譯器知道對id類型(這是什麼-objectAtIndex:收益),爲-intValue最可能的方法簽名[email protected]:,或者方法返回一個整數,服用2個參數(self_cmd)。

唯一的地方,這將有所作爲是如果你使用點語法,例如。

int thisLetterInt = [levelSavedSolutionArrayFIX objectAtIndex:i].intValue; // compile error 

因爲類型id不顯示編譯器的任何屬性,必須先投它。

int thisLetterInt = ((NSNumber *)[levelSavedSolutionArrayFIX objectAtIndex:i]).intValue; // compiles fine 

至於釋放,不,原始類型堆棧,而不是堆,這意味着當前範圍退出後,他們會被自動清理上分配的。

+3

你不會浪費CPU週期。兩者都會編譯成完全相同的東西。還是你的意思是機器的CPU週期正在編譯並且不得不在源文件中讀入更多字符? – mattjgalloway 2012-03-16 22:11:26

+0

@mattjgalloway是的,我的意思是編譯時間。澄清了這一職位。 – 2012-03-16 22:12:41

+0

好東西。儘管如此,我認爲擁有'NSNumber *'仍然是個好主意。 – mattjgalloway 2012-03-16 22:19:10

1

使用第二種方法。它更簡單,代碼更具可讀性。 在內存管理方面,如果您沒有使用像這樣的「新」運算符爲它們分配內存,則不負責管理像int,float這樣的基本類型。

+2

'new'是一個爲C++保留的關鍵字。這個問題是關於objc,而不是objC++。我相信你在這種情況下正在討論'malloc'。 – 2012-03-16 22:09:52

+0

是的。感謝您指出了這一點。 – Eugene 2012-03-16 22:39:49

0

我個人認爲,最可讀的和安全的方法是做到這一點:

int thisLetterInt = [(NSNumber*)[levelSavedSolutionArrayFIX objectAtIndex:i] intValue]; 

很簡單,因爲objectAtIndex回報id等你再明確鑄造到NSNumber*因此,如果編譯器會幫助你您錯誤地拼寫了intValue的實例,它會發出警告。

然而,因爲intValue返回int,所以它是多餘的,因此您不需要投射到int

在內存和計算時間方面 - 所有這些方法在運行時都會完全相同。所以沒有區別。編譯器將不得不在每種情況下做一些稍微不同的工作,但這樣做很小,不值得擔心。

而且沒有釋放需要完成,沒有。

+0

Downvoted,因爲這不是關於風格的問題,而是關於「內存和計算時間」。 – 2012-03-16 22:16:48

+0

但是,如果有的話,它確實會造成非常非常微小的差別。如果您認爲具體證明,請向我們展示具體證據。 – mattjgalloway 2012-03-16 22:20:47

+0

另外,增加了一些關於內存和計算時間。我認爲他在談論運行時內存和計算時間。 – mattjgalloway 2012-03-16 22:23:04

0

你不需要任何鑄件,所以第二個是正確的。你只是浪費處理器時間。無論如何,您必須確保levelSavedSolutionArrayFIX包含NSNumber的元素。如果有可能獲得另一種類型 - 你會崩潰。任何投射都不會幫助你。

+0

當然,除非其他類型像NSString,並且也響應'-intValue'。 – 2012-03-16 22:27:05

+0

任何不響應intValue的類型。 NSString響應intValue - 所以沒問題。 – SVGreg 2012-03-16 22:35:07