Objective-C和ARC:为什么永远不会读取在初始化期间存储的值?

时间:2012-11-14 15:42:42

标签: iphone objective-c cocoa-touch automatic-ref-counting

我在 ARC

中使用此代码
NSMutableDictionary *datesDict = [[NSMutableDictionary alloc]init];
NSMutableArray *datesArray = [[NSMutableArray alloc]init];

for (NSString *key in programsArray) {

    datesArray = [_onDemandDictionary objectForKey:key];
    NSMutableArray *newDates = [[NSMutableArray alloc]init];
    int count;
    for (count = 0; count <datesArray.count; count++) {
        NSMutableDictionary *programsDict = [[NSMutableDictionary alloc]init];
        programsDict = [datesArray objectAtIndex:count];
        [newDates addObject:[programsDict objectForKey:@"date"]];

    }

    [datesDict setObject:newDates forKey:key];
}

但是当我运行分析器工具时,我在初始化过程中将值存储到(datesArray和programsDict)中的行是

NSMutableArray *datesArray = [[NSMutableArray alloc]init];
programsDict = [datesArray objectAtIndex:count];

为什么会发生这种情况?如何隐藏警告?

谢谢!

3 个答案:

答案 0 :(得分:17)

问题是您创建了新的NSMutableArray并在开头将其分配给datesArray

NSMutableArray *datesArray = [[NSMutableArray alloc]init];

然后几乎在您使用

datesArray分配完全不同的值之后立即
datesArray = [_onDemandDictionary objectForKey:key];

我只想从

开始
NSMutableArray *datesArray = nil;

这与programsDict的概念相同。

答案 1 :(得分:2)

在第2行,您创建一个新数组datesArray 然后,在第6行(for循环的第一行)上,将新值设置为datesArray

编译器只是警告你第2行没有效果,并且代码被窃听(从某种意义上说它不符合你的预期)。
是的,programsArray可能是一个空数组,在这种情况下,您只需要初始化datesArray以在您向我们展示的代码段之后使用它,但最好将其显式化。< / p>

对于programsDict,它更容易:您使用... alloc] init]初始化它,然后将其设置为datesArray的对象,使第一个操作无用。

答案 2 :(得分:0)

你没有在你的循环中使用datesArray,你只需要赋值给它,所以要么把它取为nil数组,如

NSMutableArray* datesArray = nil;

或喜欢

NSMutableArray *datesArray;

删除waring。