ios什么是ios 内存泄漏检测

iOS内存泄漏的常见情况
来源:open开发经验库
来自: 
声明delegate为strong类型,简而言之,如果父VC持有子VC,并设置子VC的delegate为self(也就是父VC),这样的结果就是子VC也间接持有了父VC,造成循环引用,在Pop子VC的时候不会调用delloc。
timer是否持有self,我们一般要执行一个timer的时候会用(NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)ti
target:(id)aTarget
selector:(SEL)aSelector
userInfo:(id)userInfo
repeats:(BOOL)yesOrNo
这里的aTarget一般是self,这时候就需要注意了,如果在你退出的时候这个timer还在执行的话由于这个timer会持有self,所以delloc也不会调用,这里可以用weakSelf代替self也是没有问题的。
最常见的就是block导致的循环引用,由于在重构APP中用到了MVVM架构,使用了大量的信号机制,导致block到处飞(哈哈),解决的最多的就是这种了,解决方法也很简单,就是在block外声明__weak type(self) weakSelf = self,在block中用weakSelf就可以了,还有就是在block中如果使用了成员变量的下划线形式也要改成weakSelf.PropertyName的形式。MVVM中定义了宏对@weakify(self)和@strongify(self)可以理解为__weak type(self) weakSelf = self的简化形式,可以拿来直接使用。
图片没释放,instrument调试后,发现没被释放的全是imageIO,差不多就知道了,把读图的方式,从[UIImage imageNamed:@""],改成imageWithContentsOfFile,就可以了。
使用GPUImage处理拍照的时候,内存稳定不明增长。是Xcode7.1的问题。。只在debug的时候导致内存崩溃,release的时候并不会造成内存溢出,所以可以不必管它。
CoreFoundation对象(C对象) : 只要函数中包含了create\new\copy\retain等关键字, 那么这些方法产生的对象, 就必须在不再使用的时候调用1次CFRelease或者其他release函数
免责声明:本站部分内容、图片、文字、视频等来自于互联网,仅供大家学习与交流。相关内容如涉嫌侵犯您的知识产权或其他合法权益,请向本站发送有效通知,我们会及时处理。反馈邮箱&&&&。
学生服务号
在线咨询,奖学金返现,名师点评,等你来互动ios内存泄漏和内存溢出区别有哪些?
输入手机号码,报价结果将发送到您手机
装修顾问-馨馨
4年行业经验,24h可咨询
10秒闪电通过好友
报价短信已发送到您的手机
因材料品牌及工程量不同,具体报价以量房实测为准
稍候装修管家将回电您,免费提供装修咨询服务
您的装修预算约
*装修管家将回电您,免费提供装修咨询服务
*装修管家将回电您,免费提供装修咨询服务
*因材料品牌及工程量不同,具体报价以量房实测为准
装修顾问 -馨馨
(四年装修行业经验)
微信扫一扫
3.&您家小区名称 :&&
请选择您家的装修时间
ios内存泄漏和内存溢出区别有哪些?
提问者:滕成天| 地点:
| 浏览次数:
365| 时间:
我来帮他解答
还可以输入1500字
已有3条回答
回答数:4170
| 被采纳数:6
new等函数从堆中分配到一块内存,使用完后,程序必须负责相应的调用free或delete释放该内存块,否则,这块内存就不能被再次使用,我们就说这块内存泄漏了。
回答数:1636
| 被采纳数:0
内存溢出 out of memory,是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory;比如申请了一个integer,但给它存了long才能存下的数,那就是内存溢出。
内存泄露 memory leak,是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄露危害可以忽略,但内存泄露堆积后果很严重,无论多少内存,迟早会被占光。
希望我的回答对你有帮助!
回答数:7704
| 被采纳数:1
内存泄漏是申请的空间没有及时释放或者干脆丢了指针没法释放.不是泄漏,是漏不出来;只是泄漏的内存远小于可分配的内存时影响不大,多了就玩完.
比如你想买1000块的东西,你资产正好1000,但是有张银行卡密码忘记了,钱取不出来没法用,但是你明明有钱,不过如果那卡里只有1块钱,跟老板讲价也能买,影响不大,但是取不出来的钱多了,那就玩完.
代码的话:比如c++,new申请的空间必须delete释放,下面这么搞,没有释放,就测漏了.
希望能帮到你。下次自动登录
现在的位置:
一次IOS开发内存泄漏问题
http://cantellow.iteye.com/blog/1767699
IOS开发新手
有时候didReceiveMemoryWarning不像女人的大姨妈来的那么确定,让人摸不着头脑,不过好在有Instruments这种神器,帮我们解决了不少问题。
用Instruments分析了一下刚做好的app,发现如果反复触发同一个页面(没有做缓存),内存居高不下,仔细搜索controller的类名,发现根本就没有释放掉,触发代码如下:
XXXViewController *viewController = [[XXXViewController alloc] init];
[self.navigationController pushViewController:viewController animated:YES];
释放代码如下:
[self.navigationController popViewControllerAnimated:YES];
这几行代码没有什么复杂的,为什么pop之后XXXViewController没有释放呢,刚开始以为是NavigationController本身的机制就是这样的,后来新建了工程,写了例子代码之后发现pop之后controller是确定能够释放的。
仔细用Instruments分析了一遍XXXViewController的retain和release历史,但由于经过ARC之后有大约70多条,一个一个的分析不知道能分析到什么时候,最后检查了一遍代码,发现是由于循环引用导致。
简单来说就是XXXViewController引用了SubViewController,而在初始化SubViewController的时候把self传给了SubViewController,而且是strong引用,结果就导致XXXViewController pop之后retainCount仍然为1,从而内存泄漏了。
相比较而言,java在循环引用上处理就比较给力,java的GC使用图从根对象出发,找到无法达到的对象:
而ARC只是编译时期的特性,在合适的地方插入retain和release代码,使用简单的对象引用计算来判断对象是否该释放。
怎么解决循环引用呢?大致有两种方法:
1、手动切断循环引用中的一端,比如在pop view的时候顺便把SubViewController对self的引用切断,置为nil
2、使用weak,弱引用,本例中,在SubViewController中对self的持有置为weak引用,表示不对retainCount加1,ARC遵循这样的原则:“只要某个对象被任一strong指针指向,那么它将不会被销毁。如果对象没有被任何strong指针指向,那么就将被销毁”。
大部分情况下,我们用不到weak引用,但它却时刻伴随着我们,一个常见的例子就是oc中常见的delegate设计模式,viewController中有一个strong指针指向它所负责管理的UITableView,而UITableView中的dataSource和delegate指针都是指向viewController的weak指针。
本例中引起循环引用的业务逻辑就是子controller要用到父controller的方法,这其实不用我们手工维持这么一个引用,可以使用self.parentViewController来获取,但在这之前你必须在addSubview的时候[selfaddChildViewController:subViewController],这是一个好习惯,参见:
未优化时每触发一次都能泄漏0.5M,十次至少泄漏5M,优化后触发十次的内存:
基本上跟初始内存一模一样,可以断定没有任何泄漏了。
【上篇】【下篇】&nbsp>&nbsp
&nbsp>&nbsp
ios教程 &nbsp>&nbsp
iOS开发中本人或同事碰到的内存泄漏及解决办法
摘要:首先需要理解两个概念:OC内存管理采用的是引用计数的方式(详细请百度)内存泄漏:为什么要说这个,因为我发现好多人都在说内存泄漏但并没有理解,这里我用大白话讲一下:就是有块内存你虽然不用了但还要占着不让别人用,所以称为内存泄漏(专业的来了:memoryleak)weak关键的作用(请百度)好的,进入正题,我逐步演示碰到的各种内存泄漏:round1:-(void)viewDidLoad{[superviewDidLoad];NSMutableArray*arr1=[NSMutab
首先需要理解两个概念:
OC内存管理采用的是引用计数的方式(详细请百度)
内存泄漏:为什么要说这个,因为我发现好多人都在说内存泄漏但并没有理解,这里我用大白话讲一下:
就是有块内存你虽然不用了但还要占着不让别人用,所以称为内存泄漏(专业的来了:memory leak)
weak关键的作用(请百度)
好的,进入正题,我逐步演示碰到的各种内存泄漏:
- (void)viewDidLoad {
[super viewDidLoad];
NSMutableArray *arr1 = [NSMutableArray array];
NSMutableArray *arr2 = [NSMutableArray array];
[arr1 addObject:arr2];
[arr2 addObject:arr1];
我们用Xcode的Instruments工具检测一下
Paste_Image.png
上图中我们已经很明显的看到了循环引用解决办法:打破环!上述例子中将arr1或者arr2任意一个 弱引用就OK贴张图出来与上面代码的不同会更加清晰(^__^)
再次用工具检测:
看到leak那行都是绿色的是不是很棒?
首先我们建两个model:Student、TeacherStudent类中有属性teacherTeacher类中有属性student并且都重写了dealloc方法,打印信息
#import &Foundation/Foundation.h&
#import &Student.h&
@interface Teacher : NSObject
@property (nonatomic, strong) Student *
#import &Teacher.h&
@implementation Teacher
- (void)dealloc {
NSLog(@&%s&,__func__);
#import &Foundation/Foundation.h&
@interface Student : NSObject
@property (nonatomic, strong) Teacher *
#import &Student.h&
@implementation Student
- (void)dealloc {
NSLog(@&%s&,__func__);
第一个页面push到第二个页面,第二个页面代码如下:
#import &ViewController2.h&
#import &Student.h&
#import &Teacher.h&
@interface ViewController2 ()
Teacher *_
Student *_
@implementation ViewController2
// dealloc
- (void)dealloc {
NSLog(@&%s&,__func__);
- (void)viewDidLoad {
[super viewDidLoad];
_student = [[Student alloc]init];
_teacher = [[Teacher alloc]init];
_student.teacher = _
_teacher.student = _
运行push到第二页面在pop回第一个页面看控制台的打印信息
仅仅走了Controller的dealloc方法,两个model的dealloc都没有走
为什么呢?我们分析一下
觉得还是画图解释的快一点((⊙﹏⊙)虽然小编累一点)如图:上半部分是两个model的UML图,下半部分我们看到_student实例的teacher属性引用了_teacher实例,而实例_teacher的student属性引用了_student实例这样就形成了一个引用环,由于OC的内存管理机制就导致了这两块内存不能被释放导致内存泄漏解决办法:打破环!我们将Student或Teacher类里的属性 任意一个内存语义strong改为weak,再跑一下看看结果:
三个dealloc方法都走了,是不是很nice?
最最常见的一种,block中的操作
typedef void(^TestBlock)(void);
@interface ViewController2 ()
@property (nonatomic, copy) TestB
@implementation ViewController2
- (void)dealloc {
NSLog(@&%s&,__func__);
- (void)viewDidLoad {
[super viewDidLoad];
self.block = ^ {
self.view.backgroundColor = [UIColor redColor];
block为什么用copy修饰(请百度,不在本次讨论重点内)由于block会retain当前对象,所以这里也形成了一个环vc2引用block,block保留当前对象self解决办法:打破环!将block内的self弱引用就OK
上面3中情况都是循环引用造成的内存泄漏,解决办法都是打破环ok,看如下代码:
- (void)viewDidLoad {
[super viewDidLoad];
NSNotificationCenter* center = [NSNotificationCenter defaultCenter];
NSOperationQueue *mainQuene =[NSOperationQueue mainQueue];
[center addObserverForName:UIKeyboardWillShowNotification
object:nil
queue:mainQuene
usingBlock:^(NSNotification *note) {
self.view.backgroundColor = [UIColor redColor];
当pop到上一页面的时候 dealloc 方法也没有走,why?我们分析一下:首先center对象是一个单例的usingBlock中我们改变view颜色,block retain self对象
但是请注意:这里并没有形成环,但依然造成内存泄漏,why?
我们继续分析center对象是单例的,走完这个viewDidLoad大括号也不会释放,而他指向的block 保留了self 所以导致 self 引用计数总是不为0
解决办法:将block中的weak弱引用
__weak typeof(self) weakSelf =
NSNotificationCenter* center = [NSNotificationCenter defaultCenter];
NSOperationQueue *mainQuene =[NSOperationQueue mainQueue];
[center addObserverForName:UIKeyboardWillShowNotification
object:nil
queue:mainQuene
usingBlock:^(NSNotification *note){
weakSelf.view.backgroundColor = [UIColor redColor];
以上就是我碰到的或同事碰到的导致内存泄漏的几种情况,真正开发中碰到的应该都比较复杂,利用好Instruments加上开发时注意保持良好习惯,大都可以避免
其实这篇文章很早就想写,但是这边涉及的内容确实太多了block为什么会retain当前对象?OC为什么采用引用计数来管理内存?管理内存语义的那些关键字(strong,weak,copy等)之间的差异Instruments工具怎么灵活运用?等等,所以本篇就只针对内存泄漏,其他我也不很熟,很多没想通,也不敢写
这下也就很容易理解为什么delegate要用weak修饰了(不明白的话留言,我再补个图上来)so:到此结束!(一气呵成的感觉好爽O(∩_∩)O哈哈~)
希望会给大家带来帮助(^o^)/~
以上是的内容,更多
的内容,请您使用右上方搜索功能获取相关信息。
若你要投稿、删除文章请联系邮箱:zixun-group@service.aliyun.com,工作人员会在五个工作日内给你回复。
云服务器 ECS
可弹性伸缩、安全稳定、简单易用
&40.8元/月起
预测未发生的攻击
&24元/月起
为您提供0门槛上云实践机会
你可能还喜欢
你可能感兴趣
阿里云教程中心为您免费提供
iOS开发中本人或同事碰到的内存泄漏及解决办法相关信息,包括
的信息,所有iOS开发中本人或同事碰到的内存泄漏及解决办法相关内容均不代表阿里云的意见!投稿删除文章请联系邮箱:zixun-group@service.aliyun.com,工作人员会在五个工作日内答复
售前咨询热线
服务与支持
账号与支持
关注阿里云
InternationalIOS 常见内存泄漏以及解决方案
转载 & & 投稿:lqh
这篇文章主要介绍了IOS 常见内存泄漏以及解决方案的相关资料,需要的朋友可以参考下
IOS 常见内存泄漏以及解决方案
整理了几个内存泄漏的例子,由于转载地址已经找不到了,在这里就不一一列出来了。
1 OC和CF转化出现的内存警告
CFStringRef cfString = CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault,(CFStringRef)picDataString,NULL,CFSTR(":/?#[]@!$&'()*+,;="),kCFStringEncodingUTF8);
NSString *baseString = [NSString stringWithString:(NSString *)cfString];
CFRelease(cfString);
2,循环参照
A有个属性参照B,B有个属性参照A,如果都是strong参照的话,两个对象都无法释放。
这种问题常发生于把delegate声明为strong属性了。
@interface SampleViewController
@property (nonatomic, strong) SampleClass *sampleC
@interface SampleClass
@property (nonatomic, strong) SampleViewController *
上例中,解决办法是把SampleClass 的delegate属性的strong改为assing即可。
如果某个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];
内存泄露的情况当然不止以上两种。
感谢阅读,希望能帮助到大家,谢谢大家对本站 的支持!
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具

我要回帖

更多关于 ios nstimer 内存泄漏 的文章

 

随机推荐