2010-06-04 8 views
0

J'essaie de copier un tableau à un autre:Problème copie NSMutableArray

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

mais je reçois l'erreur:

*** 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' 

Répondre

6

Vous devez vous assurer que tous les contenu de self.items adopter la Protocole NSCopying.

Si vous souhaitez simplement une copie superficielle, envoyez le message -mutableCopy au self.items.

NSMutableArray *itemsCopy = [self.items mutableCopy]; 
+1

Ou utilisez ** copyItems: NO ** –

+0

si je mets copyItems: NO volonté il ne copie pas le contenu de self.items dans le nouveau tableau? –

+0

@Sheehan Alam: non, mais si vos objets ne sont pas conformes au protocole NSCopying, cela ne sera pas possible. –

0

Vous devez fournir vos classes avec le sélecteur copyWithZone (selon le protocole NSCopying) si vous ne copiez pas des objets qui mettent en œuvre ce protocole par défaut. Par conséquent, si vous copiez des objets personnalisés, vous devez l'implémenter. La méthode copy appelle toujours copyWithZone .. et vous devez toujours fournir la mise en œuvre, il ne peut pas savoir quoi copier l'intérieur des objets par lui-même ..

Questions connexes