Analyze分析内存

转载 2016年08月30日 09:37:52
  • 使用Xcode自带的静态分析工具 Product->Analyze(快捷键command+shift+B)可以找出代码潜在错误,如内存泄露,未使用函数和变量等

所谓静态内存分析, 是指在程序没运行的时候, 通过工具对代码直接进行分析
根据代码的上下文的语法结构, 让编译器分析内存情况, 检查是否有内存泄露

Analyze主要分析以下四种问题:

  • 1、逻辑错误:访问空指针或未初始化的变量等;
  • 2、内存管理错误:如内存泄漏等; 比如ARC下,内存管理不包括core foundation
  • 3、声明错误:从未使用过的变量;
  • 4、Api调用错误:未包含使用的库和框架。

    缺点: 静态内存分析由于是编译器根据代码进行的判断, 做出的判断不一定会准确, 因此如果遇到提示, 应该去结合代码上文检查一下

// 面向用户的文本应该使用本地化的字符串宏
1.user-facing text should use localized string macro

此为代码中配置了本地化,面向用户的应该用字符串宏,而我们直接赋值为汉字,因此,此提示可以忽略.


2.instance variable used while 'self' is not set to the result of '[(super or self) init...]

// 此方法提示错误
- (instancetype)initWithType:(FTFFavorateType)type
{
    if (self == [super init]) {
        _type = type;
    }
    return self;
}

修改为如下

- (instancetype)initWithType:(FTFFavorateType)type
{
    if (self = [super init]) {
        _type = type;
    }
    return self;
}

// 在初始化过程中存储的“持续时间值”的值永远不会被读取
3.Value stored to ‘durationValue’ during its initialization is never read

// 此段代码提示错误
NSMutableArray *datesArray = [[NSMutableArray alloc] init];
datesArray = [_onDemandDictionary objectForKey:key];

这是因为[NSMutableArray alloc] init]初始化分配了内存,而判断语句里面[_onDemandDictionary objectForKey:key]方法也相当于初始化分配了内存,就是把初始化的一个新的可变数组赋值给之前已经初始化过的可变数组,看似没什么大问题,其实存在一个数据源却申请了两块内存的问题,已经造成了内存泄露。

修改为如下

NSMutableArray *datesArray = nil;
datesArray = [_onDemandDictionary objectForKey:key];

Analyze已经分析出imageRef对象有内存泄漏,这种情况在编译时是无法发现的。
//截取部分图像

+(UIImage*)getSubImage:(unsigned long)ulUserHeader
{
    UIImage * sourceImage = [UIImage imageNamed:@"header.png"];
    CGFloat height = sourceImage.size.height;
    CGRect rect = CGRectMake(0 + ulUserHeader*height, 0, height, height);

    CGImageRef imageRef = CGImageCreateWithImageInRect([sourceImage CGImage], rect);
    UIImage* smallImage = [UIImage imageWithCGImage:imageRef];
    //CGImageRelease(imageRef);

    return smallImage;
}

Analyze逻辑错误监测:


test.png

这种情况在codereview时也较难发现,可以借助Analyze。
如上代码,当Tag不等于1、2和3的时候,就会出现很问题了。
Analyze还给出了箭头提示:len is a garbage value。建议在声明变量时,同时进行初始化。



文/船长_(简书作者)
原文链接:http://www.jianshu.com/p/2e4f7553659c
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。

相关文章推荐

XZ_iOS之"User-facing text should use localized string macro”警告的解决

"User-facing text should use localized string macro”警告的解决

使用Analyze 和Instruments-Leaks分析解决iOS内存泄露

使用Analyze 和Instruments-Leaks分析解决iOS内存泄露  使用Analyze和Instrument...

静态检测内存泄露Analyze--Value stored to 'dataArr' during its initialization is never read

最近项目快要结束了,今天就使用Analyze检测了一下看是否有内存泄漏!这一检测,好吧!应用中发现了好多一些细节的问题导致的内存泄漏,就贴出来供大家参考下。项目里面我又这样一段代码: NSMut...

iOS性能优化之内存管理:Analyze、Leaks、Allocations的使用和案例代码

原文传送门 总结的不错 叮咚~   http://www.w2bc.com/article/85256 一. 一些相关概念 很多人应该比较了解这块内容了...可以权当复习复习.....

iOS 检测内存泄漏Analyze-Potential leak of an object stored into 'soundFileURLRef'

由于iOS中CF框架需要自己释放内存,所以ARC的自动释放内存就不管用了,需要我们自己释放,需要使用CFRelease()这个方法来手动释放内存. 以下三个案列是自己在自己的项目中截取的. 案...

iOS 检测内存泄漏Analyze出现的一些问题

首先,让我们大呼三声: NO WARNING !  NO ANALYZE! NO WARNING !  NO ANALYZE! NO WARNING !  NO ANALYZE! 1. Valu...

ios 内存泄露检查器Analyze (shift+command+B)

作为手机端开发,内存shi'zui'zhong'w

iOS开发——Xcode Analyze静态分析

Xcode Analyze  代码静态分析主要有以下作用:           内存泄漏(未释放的占内存的无用僵尸对象)       代码逻辑问题 (访问空指针或未初始化的变量等) ...

21.windbg-.lastevent、!analyze(dump分析、异常错误码查询)

以下不经说明都以calc强制附加windbg1.lastevent.lastevent 命令显示最近一次发生的异常或事件。 1.lastevent .lastevent 命令显示最近一次发生的异常或事...
  • hgy413
  • hgy413
  • 2012年05月22日 12:03
  • 8600

Oracle analyze分析

ORACLE数据库的PL/SQL语句执行的优化器,有基于代价的优化器(CBO)和基于规则的优化器(RBO)。    RBO的优化方式,依赖于一套严格的语法规则,只要按照规则写出的语句,不管数据表和索...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Analyze分析内存
举报原因:
原因补充:

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