Проблема копирования NSMutableArray - PullRequest
0 голосов
/ 04 июня 2010

Я пытаюсь скопировать один массив в другой:

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 ]

6 голосов
/ 04 июня 2010

Необходимо убедиться, что все содержимое из self.items принимает протокол NSCopying.

Если вам просто нужна мелкая копия, отправьте сообщение -mutableCopy на self.items.

NSMutableArray *itemsCopy = [self.items mutableCopy];
0 голосов
/ 04 июня 2010

Вы должны предоставить своим классам селектор copyWithZone (согласно протоколу NSCopying), если вы не копируете объекты, которые реализуют этот протокол по умолчанию.

Так что, если вы копируете пользовательские объекты, вы должны реализовать это. Метод copy всегда вызывает copyWithZone .. и вы всегда должны предоставлять реализацию, он не может знать, что копировать внутри объектов сам по себе ..

...