无法获取NSString ivar来接受数组中的值

时间:2011-03-30 04:21:17

标签: iphone nsstring ivars

我将一些数据(一些浮点数,一些字符串)存储到plist然后再读回来。当我读回它们时,我将它们分配给我的视图控制器中的一些ivars。他们只是伊娃,而不是财产。

花车的价值很好,我可以NSLog他们看到它们是正确的。但无论我尝试什么,我都无法获取我的NSString ivars来获取字符串值。

示例:数组位置6和7中存储了字符串Portland, OR""Pacific Daylight Time" - 从plist读回*array.

此:

cityName = [NSString stringWithFormat:@"", [array objectAtIndex:6]];
timeZoneName = [NSString stringWithFormat:@"", [array objectAtIndex:7]];
NSLog(@" >cityName from array = %@, and now the iVar is = %@", [array objectAtIndex:6], cityName);
NSLog(@" >timeZoneName from array = %@, and now the iVar is = %@", [array objectAtIndex:7], timeZoneName);

结果如下:

>cityName from array = Portland, OR, and now the iVar is = 
>timeZoneName from array = Pacific Daylight Time, and now the iVar is = 

我在发生这种情况的方法结束时设置了一个断点,对于NSString个{iv},我会发出一个小断点,Invalid Summary.

3 个答案:

答案 0 :(得分:4)

cityName = [NSString stringWithFormat:@"%@", [array objectAtIndex:6]];

错误在于您错过了格式说明符。但具体来说,如果数组中的对象已经是字符串,您可以直接将它们分配给ivar:

cityName = [array objectAtIndex:6];

虽然注意对象所有权。您不拥有objectAtIndex:返回的对象,因此如果您需要在许多不同方法中使用此ivar,请通过发送retain获取所有权,并使用release放弃所有权。或者,如果您选择将cityName设置为班级的保留或复制属性,请使用点符号或访问器方法:

self.cityName = [array objectAtIndex:6];

// or

[self setCityName:[array objectAtIndex:6]];

答案 1 :(得分:2)

如果数组包含NSString个实例,则无需调用+stringWithFormat:。这是浪费CPU周期并撤消与不可变字符串相关的任何潜在优化。此外,依赖description的结果永远不是正确的答案(尽管NSStrings几乎不可避免 - 这是一个点,你可以依赖于结果)。

这(已修复):

cityName = [NSString stringWithFormat:@"%@", [array objectAtIndex:6]];
timeZoneName = [NSString stringWithFormat:@"%@", [array objectAtIndex:7]];

可能是:

cityName = [array objectAtIndex:6];
timeZoneName = [array objectAtIndex:7];

如果需要,请复制它。正如@dreamlax所说,请确保遵循内存管理规则。

答案 2 :(得分:0)

使用以下

cityName = [NSString stringWithFormat:@"%@", [array objectAtIndex:6]];

您需要对整数使用%d或%i,并且%@用于字符串对象。