刚对项目进行Analyze分析,发现有段代码行报Value stored to ‘version’ during its initialization is never read ,如下图所示:
从代码逻辑上来看,感觉并没有什么问题。version只是个局部变量,初始化的时候便默认了APPDebugModel为false的情况,反之才会重新赋值。仔细观察下会发现,进行Analyze时设置的APPDebugModel = true,就会出现当前这个Dead store问题。
NSString *version = [NSString stringWithFormat:@"release-%@-%@",[[HDCommonTools sharedHDCommonTools] getAppVersionStr],[[HDCommonTools sharedHDCommonTools] getAppBuildVersionStr]];
回归代码分析,NSString stringWithFormat: 方法会在初始化时为version对象分配内存地址(假设为a),此时APPDebugModel = true,继续调用NSString stringWithFormat: 方法生成一个新的对象和内存地址(假设为b)指向version,从而导致之前分配的内存a闲置不被读取而白白浪费,也就是Dead store。
为避免这个问题,对代码进行修改如下:
NSString *version;
if (APPDebugModel) {
version = [NSString stringWithFormat:@"debug-%@-%@",[[HDCommonTools sharedHDCommonTools] getAppVersionStr],[[HDCommonTools sharedHDCommonTools] getAppBuildVersionStr]];
}else {
version = [NSString stringWithFormat:@"release-%@-%@",[[HDCommonTools sharedHDCommonTools] getAppVersionStr],[[HDCommonTools sharedHDCommonTools] getAppBuildVersionStr]];
}
虽然是个逻辑上看没啥问题的问题,但却反映了思维的严谨性。写代码的时候,注意多分析多思考,千万不要为了省写else逻辑,而导致Dead store浪费内存。