IOS的ARC会导致的内存泄露问题和解决方案

转载 2015年11月17日 17:09:22

iOS提供了ARC功能,很大程度上简化了内存管理的代码。

但使用ARC并不代表了不会发生内存泄露,使用不当照样会发生内存泄露。

下面列举两种ARC导致内存泄露的情况。

1,循环参照

A有个属性参照B,B有个属性参照A,如果都是strong参照的话,两个对象都无法释放。

这种问题常发生于把delegate声明为strong属性了。

例,

@interface SampleViewController

@property (nonatomic, strong) SampleClass *sampleClass;

@end

@interface SampleClass

@property (nonatomic, strong) SampleViewController *delegate;

@end

 

上例中,解决办法是把SampleClass 的delegate属性的strong改为assing即可。

 

2,死循环

如果某个ViewController中有无限循环,也会导致即使ViewController对应的view关掉了,ViewController也不能被释放。

这种问题常发生于animation处理。

例,

比如,

CATransition *transition = [CATransition animation];

transition.duration = 0.5;

tansition.repeatCount = HUGE_VALL;

[self.view.layer addAnimation:transition forKey:"myAnimation"];

 

上例中,animation重复次数设成HUGE_VALL,一个很大的数值,基本上等于无限循环了。

解决办法是,在ViewController关掉的时候,停止这个animation。

-(void)viewWillDisappear:(BOOL)animated {

    [self.view.layer removeAllAnimations];

}

 

内存泄露的情况当然不止以上两种。

即使用了ARC,我们也要深刻理解iOS的内存管理机制,这样才能有效避免内存泄露。

arc的程序出现内存泄露怎办

实例一:

用arc和非arc混编,非arc的类在arc里实例化并且使用,在arc里居然出现内存泄露,而且应为是arc,所以无法使用release,autorelease和dealloc去管理内存。正常情况下应该是不会出现这种情况的,某一个类若是ARC,则在这个类里面都应该遵循ARC的用法,而无需关心用到的类是否是ARC的,同样,在非ARC类里面,就需要遵循内存管理原则。


用ARC,只是编译器帮你管理了何时去release,retain,不用ARC就需要你自己去管理,说到底只是谁去管理的问题,所以你再好好看看,可能问题与ARC无关。
如果实在找不到问题,建议你找到泄露的那个对象,将其赋值为nil,因为ARC里面,一旦对象没有指针指向,就会马上被释放。
 

实例二:


最近在学objective-c,我发现创建项目时如果使用了ARC,非常容易内存泄露,经常某个对象已经被释放掉了我还在使用,由于不太了解这个机制,现在我举出两个例子,请经验者帮我分析一下。
例子一:一开始,在AppDelegate.m的那个开始方法中时这样写的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
- (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#里面这种情况是不会释放掉了。

1
2
3
4
5
6
7
8
例子二:在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已经引用了啊。


解决方法:


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

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

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

ARC下导致内存泄露的几种情况

IOS的ARC会导致的内存泄露问题和解决方案 iOS提供了ARC功能,很大程度上简化了内存管理的代码。 但使用ARC并不代表了不会发生内存泄露,使用不当照样会发生内存泄露。 下面列举...
  • iOSbird
  • iOSbird
  • 2016年02月17日 17:53
  • 1777

IOS的ARC导致内存泄露的几种情况和具体解决方案

IOS的ARC导致内存泄露的几种情况和具体解决方案_解决方案 | 帮客之家 页面导航:IT教程 > 解决方案 > 正文 ...
  • zhengang007
  • zhengang007
  • 2015年07月28日 18:12
  • 1694

iOS开发 ARC下造成内存泄露的问题

新到公司,着手准备跟进项目,但是发现内存越来越大,项目是arc的,于是在某个viewcontroller中加入了dealloc方法打断电,发现viewcontroller果然没有释放,找啊找:先是把所...
  • a83988029
  • a83988029
  • 2015年06月17日 15:14
  • 628

iOS ARC也会有内存泄露

转:点击打开链接 iOS提供了ARC功能,很大程度上简化了内存管理的代码。 但使用ARC并不代表了不会发生内存泄露,使用不当照样会发生内存泄露。 下面列举两种内存泄露的情况。 ...
  • allison162004
  • allison162004
  • 2014年08月22日 11:25
  • 2504

iOS ARC内存泄露的几种情况总结

iOS提供了ARC功能,很大程度上简化了内存管理的代码。 但使用ARC并不代表了不会发生内存泄露,使用不当照样会发生内存泄露。 下面列举两种内存泄露的情况。 1,循环参照 A有...
  • henry19890519
  • henry19890519
  • 2015年10月08日 10:23
  • 1202

什么是内存溢出与内存泄露,几种常见导致内存泄露的写法

还是决定写点东西,也不能一直空着,写的可能不太好,希望大家能够尽量用包容的眼光去看待,更多的是欢迎有什么不对的地方,可以指正。         大多数时候,如果是做安卓的同学总是能听到内存泄露,或者...
  • yw876506943
  • yw876506943
  • 2015年12月21日 16:12
  • 3979

java集合中HashSet引起的内存泄漏问题

HashSet原理 HashSet采用哈希算法存取对象集合,它内部采用对某个数字进行取余的方式进行分组和划分对象的存储区域。Object对象中的hashCode方法返回每个对象哈希码,但从某个Ha...
  • zhangwj0101
  • zhangwj0101
  • 2016年03月16日 14:54
  • 278

【框架-MFC】常见内存泄漏

1、struct结构中使用CString,建议使用wchar_t*或char*代替 2、struct或class 使用父类或父结构删除指针时,注意子类或者派生类是否有成员变量占用了空间,如果子类或...
  • chenlu5201314
  • chenlu5201314
  • 2016年10月27日 16:04
  • 462

一个典型的闭包导致的内存泄露,jquery轻松解决

声明:以下内容来自《jQuery基础教程》 第四版,人民邮电出版社。附录A 作者:[美] Jonathan Chaffer Karl Swedberg 翻译:李松峰 觉得该内容很好,可以购买。 旧版本...
  • aq23es
  • aq23es
  • 2016年10月28日 15:09
  • 1740

什么情况下会导致内存泄露

Android的虚拟机是基于寄存器的Dalvik,它的最大堆大小一般是16M,有的可能是24M,当我们的内存占用超过了一定的程度后,就会出现OutOfMemory的错误。 下面说明几点可能导致内存泄...
  • yinwei1992
  • yinwei1992
  • 2016年10月12日 17:02
  • 1446
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:IOS的ARC会导致的内存泄露问题和解决方案
举报原因:
原因补充:

(最多只允许输入30个字)