2011-06-23 53 views
1

在326頁中的Objective-C 2.0書編程作者說:釋放情況與initWithInteger創建:對numberWithInt:

myNumber = [[NSNumber alloc] initWithInt: 1000]; 

當然,根據前面的討論,如果您創建myNumber這樣,你再sponsible用於隨後釋放它,當你使用它與一個語句來完成的,例如如下:

[myNumber release]; 

我的問題是:

這是否意味着如果我創建一個NSNumber對象與此聲明

NSNumber *myNumber = [NSNumber numberWithInteger: 100]; 

我沒有釋放對象myNumber自己?

回答

6

This link is your bible

[NSNumber numberWithInt:]的情況下,它會返回一個自動釋放的對象,你不需要做任何事情來正確地釋放它。除非你retain它,當然,在這種情況下,你會打電話給release,可能從你的dealloc方法。

[[NSNumber alloc] initWithInt:]返回一個保留計數爲1的對象(從調用alloc)。您有責任釋放以此方式創建的任何對象。

+0

+1:很好的鏈接。 – Jhaliya

+1

約定用於'alloc',而不是'init'。導致你擁有內存的方法是** NARC ** - 'new','alloc','retain','copy ...'。 –

+0

帶@的數字怎麼樣,比如@ 10和@(id.intValue) – n00bProgrammer

1

內存管理簡單的規則:

  • 當您使用的alloc的對象,則有責任發佈/自動釋放它。
  • 當你保留一個對象時,你有責任釋放/自動釋放它。
  • 其他人,這不是你的責任,如果你釋放/ autorelease對象,你不擁有,崩潰。
+0

指導某人[規則]總是更好(http://developer.apple。com/library/mac/documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmRules.html#// apple_ref/doc/uid/20000994-SW1)比試圖自己重述它們。例如,你遺漏了包含像mutableCopy這樣的單詞的複製,新的和方法。 – Caleb

+0

謝謝大家一樣... – xuxu

1

如果你打電話allocretainnewcopy(或mutableCopy),你是負責釋放的對象。

在所有其他情況下,該對象是自動釋放的,並且不得調用釋放。

沒有強制執行此*的編譯器或運行時規則,它只是一種語言命名約定,但在任何地方都可以使用,所以您可以指望它是真實的。

你自己的代碼也應該遵循這個約定。

*自動引用計數依賴於命名約定正常工作。詳情請參閱http://clang.llvm.org/docs/AutomaticReferenceCounting.html#objects.operands.retained_returns

+0

反正,謝謝... – xuxu

相關問題