2010-06-04 101 views
0

嗨,大家好,我開始玩Objective-C,我想確保我的內存/屬性正確。開始Objective-C,內存泄漏問題

假設以下代碼:

@interface Rectangle : NSObject 
{ 
    Vector2* origin; 
    //[...] 
} 

Rectangle* myRect = [[Rectangle alloc] init]; 
myRect.origin.x = 100.0f; 
[myRect print]; 
myRect.origin = [[Vector2 alloc] init]; //hummm.. 2 concerns here. 

關注1:

假設原點標準(分配)中合成屬性:

不myRect先前原點ref計數變爲0自動當分配新的Vector2和GC後會照顧它?或者我必須在屬性中明確地調用release?

關注2:

假設原點將是一個「保留」屬性:(順便說一句:希望聲明一個合成保留屬性時種代碼被自動生成,是可能的?)

-(void) setOrigin: (Vector2*)newOrigin { 
    [newOrigin retain]; 
    [origin release] 
    origin = newOrigin; 
} 

myRect.origin = [[Vector2 alloc] init] 

會不會造成雙重引用計數增量,那麼需要relea:做的時候

然後se被稱爲兩次以避免泄漏?當你使用庫/其他人的代碼來避免這樣的問題時,你們是否依靠良好的文檔編碼(瞭解它是一個保留屬性),還是有一些更安全的alloc/init對象?

感謝提示!

+0

只是爲了澄清 - 「原產地」應該是'Vector2 *'類型的,對嗎? – 2010-06-04 06:45:15

+0

關於通過合成屬性生成什麼樣的代碼,您發佈的內容是一個選項,並且是屬性和垃圾回收之前使用的選項。還有其他的變化。而且,在原子屬性中,這些語句會被某種互斥體括起來。 – JeremyP 2010-06-04 07:33:50

回答

4

關注1:
[...]請問myRect的上次的原點參考計數爲0自動

沒有,一個指派屬性不正是它說 - 分配。它不保留也不釋放 - 在這種情況下,您必須手動處理。

關注2:

myRect.origin = [[Vector2 alloc] init] 

會不會造成雙重引用計數增量

是的,這就是爲什麼你會要麼使用自動釋放:

myRect.origin = [[[Vector2 alloc] init] autorelease]; 

...或手動釋放:

Vector2 *v = [[Vector2 alloc] init]; 
myRect.origin = v; 
[v release]; 

至於如何處理這些問題:

  • 閱讀memory management guide
  • 看看哪些文件或財產申報說
  • 傳遞給方法總是參數假設被調用方保留,如果需要的話 - 除非另有證明
+0

這個答案假定'origin'是對象類型。如果不是這樣,那麼這個問題和這個答案根本就沒有任何意義,因爲那些微妙和不幸的原因。如果是,那麼快樂的一天...格奧爾格打敗了我。 – bbum 2010-06-04 05:40:33

+0

對。既然你分配或保留了vector2,那麼你必須釋放它。像這樣給myRect會導致myRect也保留它。 (然後,myRect將負責在它完成時釋放它。) – 2010-06-04 05:46:17

+0

+1鏈接到可可內存管理 – JeremyP 2010-06-04 07:30:28