0

我将一些数据(一些浮点数,一些字符串)存储到 plist 中,然后将它们读回。当我读回它们时,我将它们分配给我的视图控制器中的一些 ivars。它们只是 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 = 

我在发生这种情况的方法的末尾放置了一个断点,对于两个NSStringivars,弹出的小消息说,Invalid Summary.

4

3 回答 3

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]];
于 2011-03-30T04:24:15.287 回答
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 所说,请确保遵循内存管理规则。

于 2011-03-30T04:34:31.597 回答
0

下面使用

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

您需要将 %d 或 %i 用于整数,而 %@ 用于字符串对象。

于 2011-03-30T04:25:21.763 回答