2012-03-24 47 views
1

試圖進入內存管理,同時尋找泄漏,我遇到了一個問題。我有一個應用程序,它爲NSMutablearray中的某個級別放置了一個分數(int),以便將其保存起來,並且當我在數組中「替換」它時(我知道我可能不應該這樣做,但無論如何)它留下一個持久的分配。我想我的問題出現了,因爲它是一個百分比,我在做數學時遇到了問題。如果我這樣做:Xcode儀器和持久分配

NSNumber *test = [NSNumber numberWithInt:score]; 
[scores replaceObjectAtIndex:level withObject:test]; 

沒有問題。但如果我做類似

float testing = (float)score/(5) * 100; 
NSNumber *test = [NSNumber numberWithFloat:testing]; 
[scores replaceObjectAtIndex:level withObject:test]; 

or 

[scores replaceObjectAtIndex:level withObject:[NSString stringWithFormat:@"%i", score]]; 

然後我得到的問題。我總是從分配工具中獲得1個來自NSPlaceholderNumber的CFNumber Malloc。我初始化我的數組,然後唯一的方法是:

score = 75; 

float testing = (float)score/(5) * 100; 
NSNumber *test = [NSNumber numberWithFloat:testing]; 

level++; 

[scores replaceObjectAtIndex:level withObject:test];  

我不明白爲什麼一個方式會導致它,而不是其他的,或者我應該怎麼做是正確的,以避免這個問題?我甚至做了另一個只做這個例程的項目,我仍然有這個問題。提前感謝您的任何建議。

+0

+ numberWithInt增量NSNumber的保留計數。乾淨利落。 – CodaFi 2012-03-24 04:59:41

+0

在這種情況下,我將如何遞減?不過,我在使用numberWithInt時沒有問題。 – tst 2012-03-24 09:19:09

+0

CodaFi的評論是錯誤的(實際上,它沒有任何意義); + numberWithInt:返回一個自動釋放的對象。在數組中時,它被保留。當被刪除,釋放。 – bbum 2012-03-24 17:37:14

回答

1

你需要定義你認爲是一個問題。

numberWithInt:numberWithFloat:都會返回一個必須保留的對象,以使其超出對該方法的調用範圍。像這樣將對象放入數組中,會導致該對象被數組保留,因此它將堅持數組的所有權。

該代碼沒有泄漏,在代碼中也沒有任何問題

要記住的一個關鍵是泄漏儀器顯示你哪裏泄漏被分配但不會顯示導致泄漏的代碼行。即如果test號碼被泄露,那是因爲它在其他地方被過度保留。


等待 - 「永久分配」是什麼意思?即int堅持?請注意,對於整數的某些值,NSNumber具有單身人士。

+0

我試着理解可能發生的事情,從而剝離了我的代碼,所以這真的是我打電話的唯一方法。我更新了我原來的帖子。只是很難理解,爲什麼它不是一個問題,如果我把它作爲一個整數(但因爲我試圖利用一個百分比,這對我沒有用)。仍然在學習:/ – tst 2012-03-24 09:18:18

+0

我對我那篇令人費解的文章表示歉意,因爲我遺漏了信息,所以遲到了,自己也沒什麼意義。我正在運行Allocations工具,並且指的是heapshots分析中的#persistent。我認爲這是造成這個問題的對象,但是更多地使用這個對象會導致我將其替換爲索引的「級別」int。在本地創建和增加它時,我不會遇到問題。如果我使用其他方法訪問的變量(如上所述),那麼我會遇到問題。我意識到1個計數和16個字節可以忽略不計;只是想了解這個過程。 – tst 2012-03-24 19:36:39

+0

沒關係我。所以你看到的是陣列中的對象,對吧?我現在覺得很愚蠢。 – tst 2012-03-24 20:53:50