2010-04-02 55 views
2

我在Xcode這個錯誤:爲什麼我有內存問題?

objc[8422]: FREED(id): message release sent to freed object=0x3b120c0 

我用Google搜索,發現有關的記憶。但我不知道哪一行代碼出錯了,有什麼想法?在模擬器中啓動我的應用程序之後,它會提示第二個,除了上述錯誤外,沒有其他錯誤。

@implementation MyAppDelegate 

@synthesize window; 
@synthesize viewController; 


- (void)applicationDidFinishLaunching:(UIApplication *)application {  

    // Override point for customization after app launch  
    [window addSubview:viewController.view]; 
    [window makeKeyAndVisible]; 

    [self changeScene:[MainGameMenuScene class]]; 
} 


- (void)dealloc { 
    [viewController release]; 
    [window release]; 
    [super dealloc]; 
} 

- (void) changeScene: (Class) scene 
{ 
    BOOL animateTransition = true; 

    if(animateTransition){ 
     [UIView beginAnimations:nil context:NULL]; 
     [UIView setAnimationDuration:0.5]; 
     [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromLeft forView:window cache:YES]; //does nothing without this line. 
    } 

    if(viewController.view != nil) { 
     [viewController.view removeFromSuperview]; //remove view from window's subviews. 
     [viewController.view release]; //release gamestate 
    } 

    viewController.view = [[scene alloc] initWithFrame:CGRectMake(0, 0, IPHONE_WIDTH, IPHONE_HEIGHT) andManager:self]; 

     //now set our view as visible 
    [window addSubview:viewController.view]; 
    [window makeKeyAndVisible]; 

    if(animateTransition){ 
     [UIView commitAnimations]; 
    } 
} 

回答

3
[viewController.view release]; //release gamestate 

這是一個額外的版本(如果你沒有ALLOC它,不釋放)。一對夫婦的臺詞背下來了:

viewController.view = [[scene alloc] initWithFrame:CGRectMake(0, 0, IPHONE_WIDTH, IPHONE_HEIGHT) andManager:self]; 

將再次保留了新的值之前釋放viewController.view,將過度釋放的視圖,並導致崩潰(它發送釋放消息中已經被dealloc的」對象d /已經釋放的內存)。相反,嘗試:

scene *view = [[scene alloc] initWithFrame:CGRectMake(0, 0, IPHONE_WIDTH, IPHONE_HEIGHT) andManager:self]; 
viewController.view = view; // setView will release the old/retain the new 
[view release];    // so you don't need to worry about releasing it later 
+0

我可以在removeFromSuperview之前保留controller.view嗎? – Tattat 2010-04-02 15:24:53

+0

應該不需要保留或釋放它 - 特別是如果您要用新分配的視圖替換它。 – dstnbrkr 2010-04-02 15:26:40

0

得到了解決:

- (void) changeScene: (Class) scene 
{ 
    BOOL animateTransition = true; 

    if(animateTransition){ 
     [UIView beginAnimations:nil context:NULL]; 
     [UIView setAnimationDuration:0.5]; 
     [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromLeft forView:window cache:YES]; //does nothing without this line. 
    } 

    if(viewController.view != nil) { 
     [viewController.view retain]; //retain the view. 
     [viewController.view removeFromSuperview]; //remove view from window's subviews. 
     [viewController.view release]; //release gamestate 
    } 

    viewController.view = [[scene alloc] initWithFrame:CGRectMake(0, 0, IPHONE_WIDTH, IPHONE_HEIGHT) andManager:self]; 

     //now set our view as visible 
    [window addSubview:viewController.view]; 
    [window makeKeyAndVisible]; 

    if(animateTransition){ 
     [UIView commitAnimations]; 
    } 
} 

它需要我保留看法,但我不知道爲什麼這是必要的。

+0

這完全沒有必要。您不應該首先釋放視圖,因爲它是另一個對象的屬性。 – TechZen 2010-04-02 15:27:32

+0

但我可以重複使用這種方法來改變場景,我應該保持這種方式嗎? – Tattat 2010-04-02 15:29:54

0

這條線:

[viewController.view release]; 

是最有可能您的問題。除非在類的dealloc方法中,否則不要將釋放發送給對象的屬性。視圖控制器視圖屬性訪問器將爲您處理保留和釋放。

相關問題