2011-05-13 25 views
0

我寫了一些代碼,我調出一個新的視圖(從我的主視圖控制器);然後調用主控制器,當它是封閉的,像這樣 -調出新的視圖控制器 - 發佈查詢

-(void)showMyNewView { 

    MyNewViewController *myNewViewController = [[MyNewViewController alloc] initWithNibName:@"MyNewViewController" delegate:self]; 

    [self.view addSubview:myNewViewController.view]; 

} 

,然後在新的關閉,它調用 -

-(void)myNewViewControllerDidFinish:(MyNewViewController *)myNewViewController { 

    [myNewViewController.view removeFromSuperview]; 

    [myNewViewController release]; 

} 

現在這工作得很好,並沒有泄漏,但編譯器呻吟着警告:「在x行分配的對象的潛在泄漏並存儲到myNewViewController中」。

我一直在看Apple的presentModalViewController:animated:代碼,它也不會在創建它的方法中釋放新的模式視圖控制器,它似乎釋放它與dismissModalViewControllerAnimated:調用時委託的viewControllerDidFinish:方法被調用。有什麼我在這裏失蹤?使用presentModalViewController代碼不會生成任何警告。非常感謝您的幫助。

回答

-1

這裏通常要做的事情是,當您向視圖添加子視圖時,直接在子視圖之後釋放子視圖。父視圖負責子視圖。當稍後調用removeFromSuperview時,會減少保留計數並自動釋放子視圖。

+0

謝謝 - 我已經試過這個,但釋放subView導致它dealloc。我將子視圖加載爲局部變量而不是保留的屬性,這是否會成爲問題?我想避免擁有大量屬性或保留實例變量。我不知道presentModalViewController方法是否保留了傳遞給它的本地定義的視圖? – SomaMan 2011-05-13 23:09:01

+0

這不是關於視圖,而是控制器(它不會被視圖層次結構保留)。 – Eiko 2011-05-16 09:51:10

+0

我想我可能一直困惑這兩個,但我很確定我現在清楚 - 謝謝。 – SomaMan 2011-05-16 13:04:04

0

我想我現在已經明白了,我寫了一小段代碼,它給了我自己的「presentModalViewController:animated:」版本,並帶有我想要的所有控件。我很感激聽到更多經驗豐富的編碼人員對此做出了什麼(這可能非常簡單,但我沒有這麼做很長時間...),並且如果代碼存在任何問題等 -

接口:

#import <UIKit/UIKit.h> 


enum { 
    MyViewLoaderTransitionTypeNone = 0, 
    MyViewLoaderTransitionTypeSomeEffect, 
    MyViewLoaderTransitionTypeSomeOtherEffect 
}; 
typedef NSInteger MyViewLoaderTransitionType; 


@interface MyViewLoader : UIViewController { 

    UIViewController *myLoadedViewController; 

} 

@property (nonatomic, retain) UIViewController *myLoadedViewController; 

-(void)loadView:(UIViewController *)theViewController withTransition:(MyViewLoaderTransitionType)theTransition; 
-(void)dismissViewWithTransition:(MyViewLoaderTransitionType)theTransition; 

@end 

實現:

#import "MyViewLoader.h" 


@implementation MyViewLoader 

@synthesize myLoadedViewController; 


-(id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { 

    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 
    if (self) { 
     ; 
    } 

    return self; 

} 


-(void)dealloc { 

    [myLoadedViewController release]; 

    [super dealloc]; 

} 


-(void)loadView:(UIViewController *)theViewController withTransition:(MyViewLoaderTransitionType)theTransition { 

    [self setLoadedViewController:theViewController]; 

    UIView *theLoadedView = theViewController.view; 
    [self.view addSubview:theLoadedView]; 

    // do all sorts of transition stuff here 

    [theViewController viewWillAppear:NO]; 

} 


-(void)dismissViewWithTransition:(MyViewLoaderTransitionType)theTransition { 

    UIView *theLoadedView = self.loadedViewController.view; 

    // do all sorts of transition stuff here 

    [theLoadedView removeFromSuperview]; 
    self.loadedViewController = nil 

} 

我只是用MyViewLoader任何視圖控制器,我需要它的超類。

感謝您的任何意見/幫助!

相關問題