iOS 视图控制器的内存申请与释放普遍规则

  内存管理在 iOS程序开发扮演非常重要角色,对这块处理不好的程序会在实际设备上发生Crash情况.

对于经常在视图控制器中用retain声名的输出口一定要注意,在dealloc中release它们.


Obj-C声明的属性,具有如下特性,将新对象赋值当前属性,并自动释放属性中的旧对象.


1.在appDelegate.m中如果有一个window输出口,或者另外加了一个导航视图控制器或是其它什么视图控制器时,在 dealloc 方法中,执行这些输出口的release方法.而不必在applicationDidFinishLaunching中执行释放.


2.在单独的自定义视图控制器中,如果在接到内存紧缺通知时,会执行didReceiveMemoryWarning方法,它会卸载当前视图窗体,并执行viewDidUnload方法,所以在该方法中将方视图中的定义的输出口置为nil. 同时在该视图的dealloc方法(当该视图的release被调用时,该方法被执行)中执行相应的输出口release方法.  
-(void)viewDidUnload
{
    self.** = nil;
}
-(void)dealloc
{
    [** release];
    [supper dealloc];

}


3.实例方法,静态方法,获取方法返回的对象的释方规则,后两者都不必手动执行release方法,由系统的内存池自动维护.


4.如果我在appDelegate.m文件中alloc并init一个视图控制器,然后把它通过导航控制器的initWithRootViewController方法加到其中时,那么加完之后要释放那个视图
.Example:  

myController = [[*** alloc] initWithNibName:"***" bundle:nil];
UINavigationController *navi = [[UINavigationController alloc] initWithRootViewController:myController];
[myController release];
[tabController presentModalViewController:navi animated:YES];
[navi release];
-(void) dealloc
{
    [myController release]
    [tabController release];
    [supper dealloc];
}


5.在自定义视图控制器中声明了变量,但是没定义相应属性,这时对象释放规则同第1条相同.

@interface *** : UIViewController
{
    UIView *_view;
}
@end
@implementation ***
-(void)loadView
{
    [supper loadView];
    _view = [[UIView alloc] initWithFrame:[self.view bounds]];
    [self.view addSubview:_view];
}
-(void)dealloc
{   
    [_view release];
    [supper dealloc];
}
@end


6.在iPhone3开发基础教程中的样例切换视图的代码问题,我觉得里面有一个顺序写错了,之后我在google查了一下,有不少人有同问.

@implementation SwitchViewController
@synthesize blueViewController;
@synthesize yellowViewController;
- (void)viewDidLoad
{
    BlueViewController *blueController = [[BlueViewController alloc] initWithNibName:@"BlueView" bundle:nil];
    self.blueViewController = blueController;
    [self.view insertSubview:blueController.view atIndex:0];
    [blueController release];
}
- (IBAction)switchViews:(id)sender
{
    [UIView beginAnimations:@"View Flip" context:nil];
    [UIView setAnimationDuration:1.25];
    [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
    if (self.yellowViewController.view.superview == nil)//这条语句是最有趣的,OBJ-C允许向nil发送消息.
    {
        if (self.yellowViewController == nil)
        {
            YellowViewController *yellowController =
            [[YellowViewController alloc] initWithNibName:@"YellowView"
                                                   bundle:nil];
            self.yellowViewController = yellowController;
            [yellowController release];
        }
        [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView:self.view cache:YES];
        [blueViewController viewWillAppear:YES];
        [yellowViewController viewWillDisappear:YES];
        [blueViewController.view removeFromSuperview];
        [self.view insertSubview:yellowViewController.view atIndex:0];
        [yellowViewController viewDidDisappear:YES];
        [blueViewController viewDidAppear:YES];
    }
    else
    {
        if (self.blueViewController == nil)
        {
            BlueViewController *blueController =
            [[BlueViewController alloc] initWithNibName:@"BlueView"
                                                 bundle:nil];
            self.blueViewController = blueController;
            [blueController release];
        }
        //[UIView setAnimationTransition:
        // UIViewAnimationTransitionFlipFromLeft
        //                       forView:self.view cache:YES];
        //[yellowViewController viewWillAppear:YES];
        //[blueViewController viewWillDisappear:YES];
        [yellowViewController.view removeFromSuperview];
        [self.view insertSubview:blueViewController.view atIndex:0];
        //[blueViewController viewDidDisappear:YES];
        //[yellowViewController viewDidAppear:YES];
    }
    //[UIView commitAnimations];
}
- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    if (self.blueViewController.view.superview == nil)
        self.blueViewController = nil;
    else
        self.yellowViewController = nil;
}
- (void)dealloc
{
    [yellowViewController release];
    [blueViewController release];
    [super dealloc];
}
@end


7.  都在dealloc中执行.我看到在wordPress的iPhone客户端这样做的,不过好像它在特意兼容iOS3之前的版本,3.0之前的版本并不存在viewDidUnload方法,苹果的开发手册上有描述.    

-(void)dealloc
{
    [myView release], myView = nil;

}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值