【问题标题】:How to convert NSArray to NSMutableArray如何将 NSArray 转换为 NSMutableArray
【发布时间】:2011-06-01 22:52:26
【问题描述】:
ABAddressBookRef addressBook = ABAddressBookCreate();
CFArrayRef allPeople = ABAddressBookCopyArrayOfAllPeople(addressBook);  
CFIndex nPeople = ABAddressBookGetPersonCount(addressBook);

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

for(int i=0;i<nPeople;i++){

    ABRecordRef i1=CFArrayGetValueAtIndex(allPeople, i);
    [tempPeoples addObject:i1];

//  [peoples addObject:i1];

}// end of the for loop
peoples=[tempPeoples copy];

此代码给出异常 b/c 我想将 NSMutableArray 转换为 NSArray 请帮忙

【问题讨论】:

标签: objective-c nsmutablearray nsarray


【解决方案1】:

你可以这样做

NSArray *yourArray ; // Static Array
NSMutableArray* subArrayData = [yourArray mutableCopy];

【讨论】:

    【解决方案2】:

    主题为“如何将NSArray 转换为NSMutableArray”。要从NSArray 获取NSMutableArray,请使用NSMutableArray +arrayWithArray: 上的类方法。

    您的代码没有显示人民的声明。假设它被声明为NSMutableArray,如果你试图这样对待它,你可能会遇到问题。当您将复制消息发送到NSMutableArray 时,您会得到一个不可变对象NSArray,因此如果您尝试将对象添加到复制的NSMutableArray,则会收到错误消息。

    CFArrayRef 是免费桥接到NSArray,因此您可以通过这种方式简化您的代码:

    CFArrayRef allPeople = ABAddressBookCopyArrayOfAllPeople(addressBook);
    //NSMutableArray *tempPeoples = [NSMutableArray arrayWithArray:(NSArray*)allPeople];
    // even better use the NSMutableCopying protocol on NSArray
    NSMutableArray *tempPeoples = [(NSArray*)allPeople mutableCopy];
    CFRelease(allPeople);
    return tempPeoples; // or whatever is appropriate to your code
    

    在上面的代码中,tempPeoples 是一个自动释放的NSMutableArray,可供您根据需要添加或删除对象。

    【讨论】:

      【解决方案3】:

      此代码给出异常 b/c 我想将 NSMutableArray 转换为 NSArray

      非常不太可能。 NSMutableArray 是 NSArray 的派生类,因此向那个方向复制不是问题。

      也许你有一个错误,因为你没有保留数组。 arrayWithArray 返回一个 autorelease 对象。使用[tempPeoples copy][[NSArray alloc] initWithArray: tempPeoples];

      【讨论】:

      • 我做到了,但它再次给出以下异常:2010-12-31 15:30:24.889 Appointment[2708:207] *** 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因: '*** -[NSCFType isEqualToString:]:无法识别的选择器发送到实例 0x420f900' 2010-12-31 15:30:24.890 约会 [2708:207] 堆栈:( 30393435、2510714121、30775355、30344822、3019784942、3019784942、 , 3018252,
      • 好吧,我没有在您显示的代码中看到导致异常的行,我无法帮助您。你在哪里称呼'isEqualToString'?
      猜你喜欢
      • 2010-12-18
      • 2011-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多