复制NSMutableArray时出现问题

时间:2010-06-04 18:51:57

标签: iphone objective-c cocoa cocoa-touch arrays

我正在尝试将一个数组复制到另一个数组:

NSMutableArray *itemsCopy = [[NSMutableArray alloc] initWithArray:self.items copyItems:YES];

但是我收到了错误:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[Item copyWithZone:]: unrecognized selector sent to instance 0x5a74900'
*** Call stack at first throw:
(
    0   CoreFoundation                      0x025afc99 __exceptionPreprocess + 185
    1   libobjc.A.dylib                     0x026fd5de objc_exception_throw + 47
    2   CoreFoundation                      0x025b17ab -[NSObject(NSObject) doesNotRecognizeSelector:] + 187
    3   CoreFoundation                      0x02521496 ___forwarding___ + 966
    4   CoreFoundation                      0x02521052 _CF_forwarding_prep_0 + 50
    5   CoreFoundation                      0x025108fa -[NSObject(NSObject) copy] + 42
    6   CoreFoundation                      0x025ab732 -[NSArray initWithArray:range:copyItems:] + 290
    7   CoreFoundation                      0x02513963 -[NSArray initWithArray:copyItems:] + 99
    8   MyViewController                          0x0000787d -[MyViewController tableView:didSelectRowAtIndexPath:] + 258
    9   UIKit                               0x003968f8 -[UITableView _selectRowAtIndexPath:animated:scrollPosition:notifyDelegate:] + 1140
    10  UIKit                               0x0038d1de -[UITableView _userSelectRowAtIndexPath:] + 219
    11  Foundation                          0x000a404e __NSFireDelayedPerform + 441
    12  CoreFoundation                      0x025910c3 __CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__ + 19
    13  CoreFoundation                      0x02592704 __CFRunLoopDoTimer + 1364
    14  CoreFoundation                      0x024ef089 __CFRunLoopRun + 1817
    15  CoreFoundation                      0x024ee600 CFRunLoopRunSpecific + 208
    16  CoreFoundation                      0x024ee521 CFRunLoopRunInMode + 97
    17  GraphicsServices                    0x02db52c8 GSEventRunModal + 217
    18  GraphicsServices                    0x02db538d GSEventRun + 115
    19  UIKit                               0x00332e8f UIApplicationMain + 1160
    20  MyViewController                          0x0000210c main + 102
    21  MyViewController                          0x0000209d start + 53
)
terminate called after throwing an instance of 'NSException'

2 个答案:

答案 0 :(得分:6)

您需要确保self.items的所有内容都采用NSCopying协议。

如果您只想要浅色副本,请将-mutableCopy讯息发送至self.items

NSMutableArray *itemsCopy = [self.items mutableCopy];

答案 1 :(得分:0)

如果您没有复制默认情况下实现该协议的对象,则必须为您的类提供copyWithZone选择器(根据NSCopying协议)。

因此,如果要复制自定义对象,则必须实现它。 copy方法始终调用copyWithZone ..并且您必须始终提供实现,它无法知道自己在对象内部复制的内容。