2010-03-10 106 views
0

我在做一個設置方法:保留對象在objective-c

OBS:somobject是一個類的屬性。

 
– (void)setSomeObject:(SomeObject *)newSomeobject { 

    [someobject autorelease]; 

    someobject = [newSomeobject retain]; 

    return; 

} 

on [somobject autorelease]我聲明我不想在setSomeObject的作用域下擁有更多的對象。

其他對象保留的「someobject」是否會被釋放?或者該對象將在setSomeObject方法上發佈?

如果someobject類的屬性已經存在?

此對象的行爲是什麼?

回答

1

你有一個重要的問題,因爲它似乎有兩個變量(方法參數和一個實例變量)具有相同的名稱。編譯器(和這個問題的讀者,就此而言)不能告訴你所指的是哪一個。

爲了您的內存管理的問題,檢查出Apple's programming guide.

+0

好的,我已閱讀並理解。謝謝。 someobject將被釋放,並且該屬性將被設置爲另一個屬性,並且在newSomeObject上調用retain以確保對象的所有權。 – okami 2010-03-10 12:34:51

2

,以便它從伊娃不同我會重命名方法的參數:

– (void)setSomeObject:(SomeObject *)newObject 
{ 
    [someobject autorelease]; 

    someobject = [newObject retain]; 
} 

你也應該閱讀內存管理蘋果的文檔和@property@synthesize

0

你需要一個二傳手,以實現什麼目標是:

  1. 釋放任何舊的對象
  2. 保留新對象
  3. 分配新對象的實例變量

當然,如果按字面順序執行操作,則在舊對象相同的情況下,可能會過早釋放該對象。這就是「autorelease」派上用場的地方,因爲它會安排要釋放的對象,但只能在您的方法返回之後。

命名方法參數&實例變量同樣是(恕我直言)混亂,並會給你一個編譯器警告,但是如果你絕對堅持這樣做,你可以使用「self->」來指定你「再參照實例變量:

– (void)setSomeObject:(SomeObject *)someobject { 

[self->someobject autorelease]; 

self->someobject = [someobject retain]; 

return; 

}

最後,除非你setter方法必須做一些特別的東西,你應該考慮使用@synthesize有你的setter /吸氣自動生成。

+0

大衛,你爲什麼要放棄回報;我也在很多例子中看到了這一點,並且不理解,如果該方法將返回爲什麼你要返回? – okami 2010-03-10 13:22:00

+0

@okami沒有很好的理由。我複製/粘貼您的原始代碼,並忽略刪除「返回」。你說得對,它沒有任何用處。 – 2010-03-10 13:31:11

+0

但它是來自Mac開發中心的許多例子。請看:http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmObjectOwnership.html#//apple_ref/doc/uid/20000043-BEHDEDDB 轉到「Acessor Methods」會話 – okami 2010-03-10 14:20:57