NSArray objectAtIndex 不工作。请帮忙

Posted

技术标签:

【中文标题】NSArray objectAtIndex 不工作。请帮忙【英文标题】:NSArray objectAtIndex is not working. Please help 【发布时间】:2010-06-23 14:00:13 【问题描述】:
NSArray* address = [NSArray arrayWithArray:[detailItem addressArray]];
NSLog(@"address = %@", address);
NSString* addressToString = @"";
int arrayCount = [address count];
for (int i = 0; i < arrayCount; i++) 
    addressToString = [addressToString stringByAppendingString:[address objectAtIndex:i]];
    if (i == arrayCount -1) 
        addressToString = [addressToString stringByAppendingString:@""];
     else 
        addressToString = [addressToString stringByAppendingString:@", "];
           

address 是一个保存地址的 NSArray

2010-06-23 09:05:19.346 iPhoneExample[1093:207] address = (
        
        City = "Cupertino";
        Country = "United States";
        CountryCode = us;
        State = CA;
        Street = "1 Infinite Loop";
        ZIP = 95014;
    
)

我正在尝试遍历数组并创建一个 CSV 字符串,使其看起来像

Cupertino, "United States", us, CA, "1 Infinite Loop", 95014

但是,我一直在崩溃

addressToString = [addressToString stringByAppendingString:@", "];

我收到的消息是

*** -[NSCFDictionary stringByAppendingString:]:无法识别的选择器发送到实例 0x1c2f10

更新: detailItem 是 ABContact 类型的对象(自定义类)。

ABContact 有一个名为 addressArray 的属性

@property (nonatomic, readonly) NSArray *addressArray;

我的addressArray的定义是

- (NSArray *) addressArray return [self arrayForProperty:kABPersonAddressProperty];

【问题讨论】:

错误信息是自描述的——地址对象不是一个数组——它是一个字典,你应该相应地处理它。 我的类从 ABContact 类返回一个 NSArray 怎么样? 【参考方案1】:

您的“地址”是 NSDictionary 的 NSArray,而不是 NSArray 的 NSArray。

要将字典的值作为数组获取,可以使用

[theDictionary allValues]

但订单上没有保证。我认为你真正需要的是:

NSMutableString* addressToString = [NSMutableString string];  // use mutable string!
for (NSDictionary* item in address)      // use fast enumeration!
  [addressToString appendFormat:@"%@, \"%@\", %@, %@, \"%@\", %@\n",
   [item objectForKey:@"City"], 
   /* etc ... */
  ];

【讨论】:

唯一的问题是我传入的模型(detailItem)并不总是具有所有相同的属性。有些地址没有城市,州有些地址有邮政编码和州所以我怎样才能(以编程方式)确定要包含的内容。 Google 不喜欢使用 NSMutableString。 maps.google.com/maps/geo?q=%@&output=csv @orangecl4now an NSMutableString is an NSString,任何可以使用NSString的地方都可以使用NSMutableString @orange:如果城市不存在,-objectForKey: 将返回nil orangecl4now:Google 对 NSMutableString 没有意见;实际上,您传递的对象类别并不重要。将nil 传递给%@ 说明符将导致输出出现“(null)”,因此objectForKey: 返回nil 不是问题。您生成 URL 的代码有其他问题。【参考方案2】:

这个:

2010-06-23 09:05:19.346 iPhoneExample[1093:207] address = (
    
    City = "Cupertino";
    Country = "United States";
    CountryCode = us;
    State = CA;
    Street = "1 Infinite Loop";
    ZIP = 95014;

)

是NSDictionary。您将希望通过 [dictionary objectForKey:'City'] 访问其成员

因此,您更新后的代码应为:

NSDictionary* address = [detailItem addressArray];
NSLog(@"address = %@", address);
NSString* addressToString = @"";
int counter = 0;
for (id object in myDictionary) 
  if (counter != 0)
    addressToString = [addressToString stringByAppendingString:@","];
  addressToString = [addressToString stringByAppendingString:object];   
  counter++;

【讨论】:

唯一的问题是字典objectEnumerator 不一定以任何顺序返回内容,因为字典本身不保持顺序。另外,您应该使用for..in 语法。它更简单。另外,您从未增加过counter。我已经为你编辑了代码。 :) 另外顺便说一句,这将创建一个 lot 额外的自动释放对象。我会改用NSMutableString 谢谢!我忘了添加计数器增量... :) 我知道排序和自动释放对象的问题,但我想尽可能接近 OP 的原始代码。 huntaub:不,address 是一个 NSArray 实例(描述为(…))。它的唯一元素(描述为)是一个NSDictionary。【参考方案3】:

如果您可以将 addressArray 方法更改为实际返回数组而不是字典,那么您可以这样做:

NSString * addressString = [[detailItem addressArray] componentsJoinedByString:@","];

就是这样……

【讨论】:

以上是关于NSArray objectAtIndex 不工作。请帮忙的主要内容,如果未能解决你的问题,请参考以下文章

Swift 3:UITabBarController 错误:'*** -[__NSArray0 objectAtIndex:]:索引 1 超出了空 NSArray 的范围'

*** 由于未捕获的异常“NSRangeException”而终止应用程序,原因:“*** -[__NSArray0 objectAtIndex:]: index 0 beyond bounds fo

NSArray objectAtIndex 索引 1 超出 [0,0] 的范围?

从 NSArray objectAtIndex 返回的 NSString 是自动释放还是保留

安全的 NSArray 访问

[__NSArrayM objectAtIndex:]: 索引 2 超出范围 [0 .. 1]'