工具:
XCode7.2.1
Instruments 7.2.1
网上搜索了那么多的XCode检测内存泄露的Instruments使用,但是都是XCode5.几的版本,太老了,今天博主就分享博主最新测试的内存泄露使用方法,如有错误之处,请在下方随意批评并指点,博主万分感激!~~
看完后请点赞!谢谢~
博主故意做了一个内存泄露的代码,ARC环境下的循环引用
代码:
#import "ZRViewController.h"
@class Person1;
@interface Person2 : NSObject
@property (nonatomic, strong) Person1 *person;
@end
@implementation Person2
- (void)dealloc
{
NSLog(@"Person2 dealloc");
}
@end
@interface Person1 : NSObject
@property (nonatomic, strong) Person2 *person;
@end
@implementation Person1
- (void)dealloc
{
NSLog(@"Person1 dealloc");
}
@end
@interface ZRViewController()
@property (nonatomic, strong) Person1 *p1;
@property (nonatomic, strong) Person2 *p2;
@end
@implementation ZRViewController
- (Person1 *)p1
{
if(!_p1){
_p1 = [[Person1 alloc] init];
}
return _p1;
}
- (Person2 *)p2
{
if(!_p2){
_p2 = [[Person2 alloc] init];
}
return _p2;
}
- (void)viewDidLoad
{
[super viewDidLoad];
[self.view setBackgroundColor:[UIColor purpleColor]];
[self p2];
[self p1];
self.p1.person = self.p2;
self.p2.person = self.p1;
}
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
[self dismissViewControllerAnimated:YES completion:nil];
}
- (void)dealloc
{
NSLog(@"ZRViewController dealloc");
}
@end
这个是源文件中的代码,头文件中就不写了
其中p1指向p2,p2指向p1,两个对象都是强引用,并且互相指向,故而造成内存泄露
点击Profile,出现
新版的Instruments和以前旧版本长的不一样,选择Choose后,
博主的项目是ceshi,Leaks表示测试的是内存泄露
注意这里要指定 测试项目 , 点击左上角的红色按钮,开始启动测试,这时候,模拟器会启动应用,然后点击模拟器,instruments会记录各个代码的泄露问题,如果出现内存泄露,在上方的红色叉叉就是,点击红色叉叉,会进入泄露的代码位置,双击它就可以进入项目中的代码
如图:
搜索自己的类,原因是太多了,太难找
本身Person1或者Person2类只占用16字节,但是由于未释放,且互相指向,又占用16字节,等于32字节,如果我继续点击项目让它继续内存泄露,它还会占用一倍的内存
上面的红色叉叉就是表示该位置有内存泄露,点击它,就可以进入查看
博主刚才手欠,又点击了一下,看看结果,与上图相比
引用计数加一,占用内存加16字节
点击那个叉叉(内存泄露位置)
四个对象,各占16字节,属于ZRViewController控制器的
比如:
进入Person2的对象创建和销毁,
清晰的看到对象的创建与销毁的引用计数
下面解释上面的表格title的英文意思
Category 类名
persistent Bytes:当前活跃的内存
persistent:当前活跃的内存数量
Transient:当前已经分配内存但仍然没有被释放的对象或内存块的数量
Total Bytes:使用过的内存
Total:全部的内存数,不管是使用还是没有使用的都算
如果写的有什么问题,真心接受各位的指点。。。。。。。
请点赞,谢谢~~~