2011-06-21 64 views
0

我有一個ivar我會調用dictionaryIvar,這是一個可變的字典。有時候,它的內容必須被刪除並用新的內容重新設置。內容被添加了多次不定量的迭代,因此它爲什麼是可變的。重置NSMutableDictionary的內容iVar

是否足夠「重置」或釋放字典中:

self.dictionaryIvar=nil; 

,然後在不同的方法,需要的地方,重建具有詞典:

if(!self.dictionaryIvar){ 
self.dictionaryIvar = [NSMutableDictionary dictionary]; 
} 

請問這是可以接受的,或者這會泄漏物體?

回答

4

如果你的財產的定義是這樣的:

@property (nonatomic, readwrite, retain) NSMutableDictionary *dictionaryIvar; 
//... 
@synthesize dictionaryIvar; 

然後合成方法會照顧釋放/保留字典對象。

self.dictionaryIvar = [NSMutableDictionary dictionary]; 

應該是足夠的。

有其中前者被傳遞給合成屬性方法(- (NSMutableDictionary *)dictionaryIvar;- (void)setDictionaryIvar:(NSMutableDictionary *)aDictionary;分別地)和dictionaryIvar簡單地訪問變量self.dictionaryIvardictionaryIvar之間的差DISTICT。

因此這會泄露(和崩潰,兩者):

dictionaryIvar = [NSMutableDictionary dictionary]; 

雖然不會:

self.dictionaryIvar = [NSMutableDictionary dictionary]; 

但我會(在大多數情況下)真的只是去與這個簡單的電話:

[dictionaryIvar removeAllObjects]; 
+1

'dictionary'是類方法返回一個autorelease字典對象,我懷疑你的語句'dictionaryIvar = [NSMutableDictionary字典];'會導致崩潰.. .. – Jhaliya

+0

@Jhaliya:是的,它肯定會崩潰(除非保留以後)。除了泄漏。添加了一個筆記來回答。 – Regexident

+0

謝謝,非常有用 – johnbakers

1

而不是這樣做,爲什麼不......

[dictionaryIvar removeAllObjects]; 
0

你與nil使用self.設置它它不被泄露,它會調用設置功能,爲您的dictionaryIvar,然後將釋放之前保持的對象和分配nil

我傾向於在dictionaryIvar變量上調用適當的版本。

[dictionaryIvar release]; 
    dictionaryIvar = nil; 

if(!dictionaryIvar){ 
    dictionaryIvar = [[NSMutableDictionary dictionary] retain]; 
} 
+0

爲什麼他應該使用直接ivar訪問而不是僅僅調用setter? –

+0

@BJ荷馬:他有選擇去任何一種方式,但是當你用已經創建的對象設置你的對象時,我更願意使用'self.propertyName'。像'self.propertyName = otherObject; ' – Jhaliya

+0

這很好,但如果沒有技術上的理由來使用另一種,那麼你可能會考慮說「我更喜歡使用_____」而不是「我會推薦_____」,因爲後者表明什麼東西有什麼問題他現在在做。 –

0

假設你@property設置爲retain,這應該是罰款。自動使用點符號(self.dictionaryIvar)將釋放並保留您的字典。

如果你只是想清除字典,雖然,它可能會更好,只是調用字典的-removeAllObjects方法:

[self.dictionaryIvar removeAllObjects];

1

如果你想改變字典的內容,你可以用新的字典來代替它。在一個行:

[dictionaryIvar setDictionary:[NSMutableDictionary dictionary]];

這已做了[dictionaryIvar removeAllObjects](也發送release到其中包含的所有對象),其次是來自新字典添加對象(在你的情況相同的效果,空)。

而且,通過這樣做,你不必擔心你的伊娃的所有權和內存管理的問題,如果你需要做的是「重置」的字典...