我有一些场景,我分配init变量,然后用一些数据初始化它。对于例如
ABCClass *objectAbc = [[ABCClass alloc] init]; //---- Analyser warning
objectAbc = someOtherObjectOfThisKind;
NSArray *array = [NSArray array]; //---- Analyser warning
array = arrayOfArrays[0];
在两种情况下,分析仪都会给我警告value never read
。初始化变量的正确方法是什么。我是否增加了保留计数?
如果我们有多个ifs,如何初始化变量,可以说,
- (void)computeVariable {
NSString *var = @""; // ----Analyser Warning
if ( [someLabel isEqualToString @"A"] ) {
var = @"A";
}
if ( [someLabel isEqualToString @"B"] ) {
var = @"B";
}
... remaining code
}
答案 0 :(得分:4)
您的第一个语句声明了一个变量,并为其指定了一个类型为ÀBCClass`的新对象。第二个语句为此变量分配另一个对象。因此,第一个语句的对象被释放(ARC),并且您的程序从不使用它。你应该把这两行写成
ABCClass *objectAbc = someOtherObjectOfThisKind;
并且分析器消息将消失。变量array
也是如此。
如果您使用ARC,则无法明确保留变量。如果您正在使用MRC,则[[ABCClass alloc] init]
有一个内存泄漏,因为您没有向此对象发送release
。另一方面,由于Objective C的内存管理规则,[NSArray array]
在MRC中不会泄漏。
编辑的附录:如果在if块之后使用var
,则不会收到分析器警告,因为即使两个条件都为假,也会使用var
的初始值。如果仅在{if}块中使用var
,则会收到分析器警告。在这种情况下,您应该在每个if块中移动var
的声明,或者不初始化它,e。 G。 NSString *var;
。