iPhone - Plantage lors de l'utilisation addObject sur un NSMutableArray
J'ai un problème ici. Ou Peut-être que je suis vraiment fatigué...
J'ai une classe :
@interface THECLASS : UIViewController <UITableViewDelegate> {
NSMutableArray* param;
}
@property(nonatomic, retain) NSMutableArray* param;
À l'intérieur de cette classe, j'ai une méthode qui est appelée lorsque l'utilisateur clique sur un UISwitch à l'intérieur d'un tableViewCell (je construire les params dans une IBAction méthode qui n'est pas shwon ici) :
@synthesize param;
- (void) changedSelectorValue:(NSIndexPath*)indexPath isOn:(BOOL)isOn {
[self.param addObject:@"eeeee"];
}
Ce bloque l'application avec le journal suivant :
2011-02-04 01:31:02.548 Learning Project[3895:207] -[__NSArrayI addObject:]: unrecognized selector sent to instance 0x630c960
2011-02-04 01:31:02.549 Learning Project[3895:207] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSArrayI addObject:]: unrecognized selector sent to instance 0x630c960'
*** Call stack at first throw:
(
0 CoreFoundation 0x00fc4be9 __exceptionPreprocess + 185
1 libobjc.A.dylib 0x011195c2 objc_exception_throw + 47
2 CoreFoundation 0x00fc66fb -[NSObject(NSObject) doesNotRecognizeSelector:] + 187
3 CoreFoundation 0x00f36366 ___forwarding___ + 966
4 CoreFoundation 0x00f35f22 _CF_forwarding_prep_0 + 50
5 Learning Project 0x00019463 -[ChoixJoursDisponibiliteController changedSelectorValue:isOn:] + 644
6 Learning Project 0x000190db -[ChoixJoursDisponibiliteController clickChangedSelectorValue:] + 307
7 UIKit 0x002f6a6e -[UIApplication sendAction:to:from:forEvent:] + 119
8 UIKit 0x003851b5 -[UIControl sendAction:to:forEvent:] + 67
9 UIKit 0x00387647 -[UIControl(Internal) _sendActionsForEvents:withEvent:] + 527
10 UIKit 0x004c9c6d -[UISwitch _onAnimationDidStop:finished:context:] + 201
11 UIKit 0x00327665 -[UIViewAnimationState sendDelegateAnimationDidStop:finished:] + 294
12 UIKit 0x003274f7 -[UIViewAnimationState animationDidStop:finished:] + 77
13 QuartzCore 0x01eab6cb _ZL23run_animation_callbacksdPv + 278
14 QuartzCore 0x01eab589 _ZN2CAL14timer_callbackEP16__CFRunLoopTimerPv + 157
15 CoreFoundation 0x00fa5fe3 __CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__ + 19
16 CoreFoundation 0x00fa7594 __CFRunLoopDoTimer + 1220
17 CoreFoundation 0x00f03cc9 __CFRunLoopRun + 1817
18 CoreFoundation 0x00f03240 CFRunLoopRunSpecific + 208
19 CoreFoundation 0x00f03161 CFRunLoopRunInMode + 97
20 GraphicsServices 0x018f9268 GSEventRunModal + 217
21 GraphicsServices 0x018f932d GSEventRun + 115
22 UIKit 0x0030542e UIApplicationMain + 1160
23 Learning Project 0x00002580 main + 102
24 Learning Project 0x00002511 start + 53
25 ??? 0x00000001 0x0 + 1
)
terminate called after throwing an instance of 'NSException'
param est rempli d'un appelant vue par quelque chose comme :
NSMutableArray* filledArray = [NSMutableArray arrayWithObjects:@"SOME TEXT", nil]
nextController.param = filledArray;
NSLog(@"%@", self.param);
juste avant le crash donne :
2011-02-04 02:01:17.205 Learning Project[4223:207] (
"JOURDISPO_MARDI"
)
Pourquoi ce blocage ?
Le tableau est là, rempli et pas nul... Il semble bien définie... addObject est un NSMutableArray méthode... je ne comprends pas
Je ne le montre pas ici, mais il y a le même journal avec removeObject.
param
propriété?DeLong : c'est un tableau rempli de l'appelant vue. C'est ok, pas de problème avec elle. Il est rempli et d'ailleurs, je l'utilise pour faire des démonstrations.
il est rempli à l'extérieur par [NSMutableArray arrayWithObjects:@"TEXTE", nil]
OriginalL'auteur Oliver | 2011-02-03
Vous devez vous connecter pour publier un commentaire.
Votre propriété est définie comme
retain
, et vous dire queparam
est "rempli un tableau à partir de l'appelant". Ce pourrait être votre problème.Par exemple, si vous effectuez les opérations suivantes:
Vous avez retenu les services d'un non-mutable tableau.
Edit: Pour déboguer le réglage de
param
, vous pouvez effectuer les opérations suivantes dans votre .m:Je pense qu'il faudrait
[filledMutableArray mutableCopy]
, sinon vous obtenez justeNSArray
de nouveau. Vous ne savez pas si c'est encore le problème, cependant. Pouvez-vous ajouterNSLog(@"%@", param);
dans votre méthode, juste avant le crash pour voir quel type d'objet il s'agit?En fait, gratter la
NSLog
. Il est évident queparam
est en quelque sorte d'un non-mutableNSArray
quelque part dans votre code. Il pourrait être intéressant de créer un personnalisé définition pour laparam
bien et puis le journal de son comportement avant que l'incident se produit.J'ai ajouté l'exemple de débogage de code dans ma réponse. En utilisant cela, vous devriez être en mesure de déterminer quand
param
devient immuableLa coutume de poseur de ne pas résoudre votre problème. Je suggère, c'est une façon de déboguer. La sortie du journal devrait vous dire où vous êtes l'obtention d'un non-mutable tableau à partir d'.
OriginalL'auteur e.James
Réponse est enterré dans les commentaires à la "accepté" réponse. Je suis venu ici à partir de Google et il a fixé mon problème, donc ... pour le rendre plus clair, basé sur @e.James commentaire:
par exemple, à partir de mon propre code:
OriginalL'auteur Adam
Pour une raison quelconque, vous êtes à l'appel de la
addObject:
méthode sur une instance deNSArray
, comme la trace de la pile indique. Peut-être la synthèse de lecture de votreparam
objet renvoie uneNSArray
? N'utilisez pas le getter dans votre méthode:En fin de compte, l'erreur est correcte. Vous appelez à une mutation de la méthode sur un objet immuable. Assez étrange, dans mes tests cela ne cause pas un compilateur, d'erreur ou d'avertissement:
Edit: Si vous voulez y croire ou non, d'une certaine façon le
param
ivar est définie à une instance d'un NSArray. Remplacer le setter:Puis ajouter un point d'arrêt sur cette méthode, et de vérifier la date d'un NSArray est passé en.
OriginalL'auteur Craig Otis
Quelle est votre méthode init? Il devrait ressembler à quelque chose comme ça...
Pour faire les choses correctement, vous devez toujours s'assurer que
[super init]
ne pas retourner nil avant d'exécuter d'autres initialisation. J'utilise:if ((self = [super init]) == nil) { return nil; }
dans la première ligneComme ci-dessus, assurez-vous de vérifier [super init] de retour nul. Aussi, sur l'iPhone (même si, en tout cas, vraiment), c'est une meilleure idée pour éviter de autoreleased objets pour ivars, c'est juste un gaspillage de temps de calcul.
OriginalL'auteur Ned
Après avoir lutté beaucoup j'ai trouvé la solution pour mon problème. Dans mon cas, le problème a été,
J'ai une mutable dictionnaire et tableau
Et je suis l'ajout du serveur tableau liste à userAccountsList tableau comme ceci
J'ai pris un autre tableau et l'ajout de serveur de liste de tableau à tableau
et enfin l'ajout de tableau à userAccountsListArray comme ce
Et ici l'ajout d'objets à un tableau
Espère que cela aide quelqu'un. Merci de voter si ça aide.
OriginalL'auteur Narasimha Nallamsetty