2011-09-22 141 views
0

我一個類的方法是這樣的:忽略保留屬性,類方法

+(CCScene *) sceneWithMovie:(NSString*)movieName level:(NSString*)levelName hudLevel:(NSString*)hudName 
{ 

    bbsScene* scene = (bbsScene*)[super sceneWithMovie:movieName level:levelName]; 
    ScenePage* hudLayer = (ScenePage*)scene.layer; 

    UTLOG(@"---> %p RETAIN COUNT: %d",hudLayer.hudLoader,[hudLayer.hudLoader retainCount]); 

    TouchLevelHelperLoader* loader = [[TouchLevelHelperLoader alloc]initWithContentOfFile:hudName]; 
    hudLayer.hudLoader = loader; 

    UTLOG(@"---> %p RETAIN COUNT: %d",hudLayer.hudLoader,[hudLayer.hudLoader retainCount]); 

    [loader release]; 

    UTLOG(@"---> %p RETAIN COUNT: %d",hudLayer.hudLoader,[hudLayer.hudLoader retainCount]); 

    [hudLayer.hudLoader addSpritesToLayer:hudLayer]; 
    NSInteger sceneNumber = [[[[self class]description] stringByReplacingOccurrencesOfString:@"Scene" withString:@""]intValue]; 
    [hudLayer loadTextPage:sceneNumber fromFile:SCENE_TEXT_FILE]; 

    // return the scene 
    return scene; 
} 

輸出是:

2011-09-22 10:53:28.477 MP NO VID[598:207] ---> 0x0 RETAIN COUNT: 0 
2011-09-22 10:53:28.490 MP NO VID[598:207] ---> 0x64af820 RETAIN COUNT: 2 
2011-09-22 10:53:28.491 MP NO VID[598:207] ---> 0x64af820 RETAIN COUNT: 2 

當我釋放加載程序的數據丟失,如果我不調用hudLayer.hudLoader = loader; 顯然我設置了:

@property(nonatomic,retain)TouchLevelHelperLoader* hudLoader; 

任何想法?也許類方法(+)是問題嗎?

+0

這是什麼意思的數據? hudLoader本身是失去了還是它的一個屬性?如果它是一個財產,它保留了嗎? – Alin

+0

[loader loader] hudLoader指向死對象後。您可以通過代碼看到hudLoader是一個保留的屬性。 – Chiodo

回答

1

不應該依賴retainCount屬性

這不是很可靠,因爲你永遠不知道幕後做了什麼。

例如,當使用像NSString這樣的類集羣時,在NSString類中內部完成的事情太多了,因此retainCount對你來說不具有真正的意義。對於某些情況下,像這樣的NSTimers &,OBJETS也由RunLoop(定於本runloop時)公佈的,但如果你不知道,這是不平凡...

顯然這兩個例子(類集羣和runloop保留)不是你在這裏,但我在這裏說的是retainCount財產是不是你應該依靠檢查是否有泄漏

此外,如果您已經激活了您的項目垃圾收集,release是NO-OP(因爲這是將管理和釋放實例的GC本身)

其實,使用retainCount是在您的項目中使用ARC時禁止從Xcode4開始。

要檢查代碼中是否存在泄漏,請使用靜態分析器(「Build & Analyze」from Xcode Build menu)和/或儀器「泄漏」工具。

+0

靜態分析儀我沒有錯誤... 如果我評論[加載器發佈]這一切都好,我沒有泄漏,但我不明白爲什麼。 調用 [hudLayer.hudLoader retain]; [loader release]; 應該沒問題,但它不是,它會崩潰。 – Chiodo

+1

然後讓它在殭屍儀器中崩潰並看到整個保留/釋放堆棧。 – Alin

+0

+1 Alin,好建議 – AliSoftware