当前位置: 代码迷 >> Iphone >> 运用ARC内存泄露
  详细解决方案

运用ARC内存泄露

热度:2634   发布时间:2013-02-26 00:00:00.0
使用ARC内存泄露
最近在学objective-c,我发现创建项目时如果使用了ARC,非常容易内存泄露,经常某个对象已经被释放掉了我还在使用,由于不太了解这个机制,现在我举出两个例子,请经验者帮我分析一下。
例子一:一开始,在AppDelegate.m的那个开始方法中时这样写的:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];    
    // Override point for customization after application launch.
    self.window.backgroundColor = [UIColor whiteColor];
    //
    UITabBarController  tabBarController = [[UITabBarController alloc] init];
    [tabBarController setViewControllers:[self showConnectViewOnWindow]];
    [tabBarController setDelegate:self];
    //
    [[self window] addSubview: [tabBarController view]];
    
    [self.window makeKeyAndVisible];
    return YES;
}

然后,我还做了其他的工作:tabBarController中有tabBarItem,点击会调用一个方法
但是每次一点击,就会报unrecognized selector send to instance的错误,
后来上网一查,说是要把tabBarController定义成全局变量,不然这个方法一结束,tabBarController就被释放掉了,这样点击产生时间的对象都没了,于是我把它定义成全局变量,确实可以了,但我的疑问是,为什么方法一结束他就会释放掉吗,[[self window] addSubview: [tabBarController view]];我这一句不是已经在self window里引用它了吗,他怎么还会被释放,我觉得java和C#里面这种情况是不会释放掉了。

例子二:在viewdidload方法里面:
    [self.navigationItem setTitle:Title];
    
    leftButton = [[UIBarButtonItem alloc] initWithTitle:Cancel 
                                                  style:UIBarButtonItemStyleBordered 
                                                 target:self 
                                                 action:@selector(CancleButtonClicked)];
    self.navigationItem.leftBarButtonItem = leftButton;

这里我给屏幕上方那个导航条加了一个左边的按钮,然后点击这个按钮后会用方法CancleButtonClicked来响应,但是我运行起来一点击,还是报unrecognized selector send to instances错误了,这里又是哪个对象释放了,leftButton吗?但是self.navigationItem.leftBarButtonItem = leftButton已经引用了啊。

请大家发表见解,谢谢。
ARC,内存泄露,

------解决方案--------------------------------------------------------
例子一[[self window] addSubview: [tabBarController view]];
你只引用了tabBarController的view,没有引用tabBarController

例子二,不知道什么原因,看看有没有拼写错误吧。

另外,我感觉局部变量的内存一般只在它的生命周期内有效。出了它所定义的区域,即使不释放,也最好不要用了。一点个人见解。
  相关解决方案