objective-c “la mutation de la méthode envoyé à immuables de l'objet” d'erreur
Je suis assez nouveau à l'objective-c et d'essayer de créer une petite application pour l'iphone.
Je suis presque fait à côté de cette petite erreur ici. En fait, j'ai cherché des heures avec google pour trouver une solution, mais malheureusement, je ne suis pas en mesure de trouver une solution qui fonctionne.
Je suis l'aide de ce tutoriel ici pour construire un UITableView: UITableView Tutoriel
Le message d'erreur complet ressemble à ceci:
* Fin de l'app en raison de uncaught exception 'NSInternalInconsistencyException', la raison: '* -[NSCFArray insertObject:atIndex:]: la mutation de la méthode envoyé immuable objet'
C'est le Contrôleur des Données d'en-Tête:
MyLinksDataController.h
@interface MyLinksDataController : NSObject {
NSMutableArray *tableList; //<---important part
}
- (unsigned)countOfList;
- (id)objectInListAtIndex:(unsigned)theIndex;
- (void)addData:(NSString *)data; //<---important part
- (void)removeDataAtIndex:(unsigned)theIndex;
@property (nonatomic, copy, readwrite) NSMutableArray *tableList; //<---important part
.....
Et le Contrôleur de Données de la Méthode:
MyLinksDataController.m
#import "MyLinksDataController.h"
@implementation MyLinksDataController
@synthesize tableList;
- (id)init {
if (self = [super init]) {
NSLog(@"Initilizing DataController");
//Instantiate list
NSMutableArray *localList = [[NSMutableArray alloc] init];
self.tableList = [localList copy];
[localList release];
//Add initial Data
[self addData:@"AAAAAAAAAAAAAA"];
[self addData:@"BBBBBBBBBBBBBB"];
}
return self;
}
-------------------------------plus tard dans le code source---------------------------------
- (void)addData:(NSString*)data; {
[tableList addObject:data]; //<---- here the app crashes
}
Je assez bien reconnaissant de toute aide.
Merci pour votre aide à l'avance.
Daniel
OriginalL'auteur | 2009-08-03
Vous devez vous connecter pour publier un commentaire.
L'envoi de la copie message à un NSMutableArray -- comme dans l'instruction suivante dans init -- retourne un immuable copie.
Cacao documentation utilise le mot immuable à consulter en lecture seule, ne peut pas être changé après l'initialisation des objets. D'où la subsequenct appel à addObject: échoue avec un message d'erreur.
Remarque comment l'instruction d'affectation ci-dessus n'est pas de déclencher un avertissement du compilateur. copie retourne un id, qui s'adapte confortablement -- autant que le compilateur est en question-dans le NSMutableArray* tableList. Il n'y a pas d'erreur d'exécution ici, pas de messages se passait autour; un NSArray pointeur est placé dans un NSMutableArray pointeur de variable.
Pour obtenir une mutable copier, utiliser mutableCopy à la place.
Noter que les deux copie et mutableCopy créer un nouveau tableau et copiez le contenu de l'original. Un changement dans la copie ne sera pas reflétée dans l'original. Si vous avez besoin d'une autre référence pour le tableau d'origine, l'utilisation conserver à la place.
Vous pouvez trouver plus de détails dans la section discussion de la copyWithZone de référence et dans le NSMutableCopying protocole de référence.
OriginalL'auteur Oren Trutner
Vous êtes en cours d'exécution, pour l'essentiel, la gestion de la mémoire règles de Cacao (plus précisément, ces détails). Si il y a un objet avec une immuable version et une mutable version, puis de l'envoyer
-copy
à un objet renvoie un objet immuable.Nous allons étape par le biais de la partie.
Cela crée un nouveau, vide mutable tableau qui vous est propre. Des beaux.
Cela crée une immuable copie du tableau vide. En outre, vous possédez ce fraîchement créé copie. C'est deux objets que vous possédez au moment.
Cela affecte également l'objet copié à la
tableList
de la propriété. Regardons la déclaration de la propriété:Cette propriété est déclarée avec le
copier
l'attribut, de sorte que chaque fois qu'une nouvelle valeur est affectée à elle, une autre-copy
méthode qui lui est envoyé. Cette troisième copie, cependant, n'est pas la propriété par vous—il, en est le propriétaire de l'objet.Qui libère l'origine vide mutable tableau. Très bien, mais il y a toujours celui que vous avez fait dans la deuxième ligne, flottant autour, inédit. C'est une fuite de mémoire.
Si vous avez réellement besoin d'une mutable copie de quelque chose, vous voulez le
-mutableCopy
méthode. (La documentation de ces méthodes est trouvé sousNSCopying
etNSMutableCopying
.) Cependant, vous n'êtes jamais allez obtenir une mutable version de quelque chose dans une propriété avec lecopy
attribut, car il va envoyer-copy
à ce qu'il est attribué. Votre propriété doit utiliser leretain
attribut au lieu de lacopy
attribut, et le code d'initialisation de il devrait ressembler à quelque chose comme ceci:Ou, une version plus courte:
Il n'y a pas besoin de copier quoi que ce soit dans cette situation, vous êtes juste de créer une nouvelle objet.
Bon point. Je voudrais aussi jeter que je n'ai presque jamais voir les objets qui font la publicité d'un
NSMutableArray
de la propriété. Le puriste en moi aurait envie de voir une coutume setter qui stocke une mutable copie de l'objet et une coutume de lecture qui renvoie un autoreleased immuable copie.OriginalL'auteur John Calsbeek
Si u sont l'attribution localList à partir d'un autre objet peut être qui n'est pas Mutable dans ce cas, il peut par le biais de ce genre d'erreur.
J'espère que ce sera utile.
OriginalL'auteur Gaurav
Salut au lieu de mutableCopy je crois "
strong
" peut également être utilisé pour s'attaquer à ce problème. J'ai eu le même problème dans mon code ainsi en raison de l'utilisation de "copy
" au lieu de "strong
." Si la ligne ci-dessous:Il devrait être:
Espère qu'il sera d'une grande aide pour les débutants de faire des erreurs comme moi.
OriginalL'auteur Rajeev Kumar Barnwal
Cela permettra de résoudre le problème:
OriginalL'auteur Asi Givati