2010-06-01 4 views
1

Mon code se bloque à cette fonction (à la stringByAppendingFormat: avec l'erreur objc_msgSend() selector name: stringByAppendingFormat).Pourquoi ce crash: stringByAppendingFormat

est que la ligne:

// imagesPath = ...iPhone Simulator/4.0/Applications/NUMBERS/Documents/images 
UIImage *image = [[UIImage alloc] initWithContentsOfFile:[imagesPath stringByAppendingFormat:@"/%d.png", [[self.postsArrayID objectAtIndex:row] intValue]]]; 

Pourrait-il avoir quelque chose à voir avec le maintien des objets?

Merci :)

+0

Donner plus de code Quel est le type de 'imagesPath'? NSArray * 'ou une autre collection au pluriel de nom suggère?) Comment initialiser cette variable? – SergGr

+0

Comme mentionné,' imagesPath' n'est probablement pas un 'NSString' - essayez' NSLog (@ "% d", [imagesPath isKindOfClass: [NSString class]]); 'pour vérifier –

+0

imagesPath est en fait un NSString, déclaré dans l'en-tête – Emil

Répondre

1
> rootPath = 
> [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, 
> NSUserDomainMask, YES) 
> objectAtIndex:0]; imagesPath = 
> [rootPath 
> stringByAppendingPathComponent:@"/images/"]; 

Hah! Définition d'une propriété et définition de la valeur à l'aide de self.imagesPath = ... fixe . Obj-c est si difficile à comprendre parfois ...

Les méthodes que vous avez utilisées pour définir l'obtenir les chemins sont autoreleased, alors quand vous avez essayé d'y accéder plus tard, ils étaient déjà morts. L'utilisation de la propriété self.imagesPath conservera les données (vous les avez spécifiées comme (non atomic, retain) - elles resteront ainsi jusqu'à ce que vous les lâchiez (ou assigner autre chose en utilisant l'accesseur de propriété self.imagesPath = ....;

Le guide de gestion de la mémoire d'Apple est fortement recommandé, bien qu'il soit toujours facile d'échouer après l'avoir lu plusieurs fois :-)

+0

Je vais le lire. avez vous un lien? J'ai déjà eu quelques problèmes: p – Emil

+0

Bien sûr, voici le lien: http://developer.apple.com/mac/library/documentation/cocoa/Conceptual/MemoryMgmt/MemoryMgmt.html Je pense qu'ils ont un copie exacte de celui-ci dans les docs de l'iPhone. – Eiko

1

Habituellement un accident dans objc_msgSend() implique le message étant transmis à l'objet (dans ce cas, stringByAppendingFormat) n'est pas spécifié pour cet objet. Quick googling révèle que beaucoup de pages supérieures pour stringByAppendingFormat sont assez datées, en déduisant que l'API a probablement été abandonnée au profit d'autre chose. Pour contourner le problème, il semblerait que +[NSString stringWithFormat:] serait une alternative viable pour votre cas d'utilisation.

+0

[Il est toujours là] (http://developer.apple.com/iphone/bibliothèque/documentation/cacao/Référence/Foundation/Classes/NSString_Class/Référence/NSString.html #/apple_ref/occ/instm/NSString/stringByAppendingFormat :), je ne vois pas cela être déprécié. –

+0

stringWithFormat ne fonctionnera pas. Je veux ajouter une chaîne à une autre chaîne. – Emil

+0

'UIImage * image = [[UIImage alloc]] initWithContentsOfFile: [NSString stringWithFormat: @"% @ /% d.png ", imagesPath, [[self.postsArrayID objectAtIndex: ligne] intValeur]]]];' – falconcreek

1

Pourquoi ne pas utiliser stringByAppendingPathComponent:? Et sûrement imagesPath n'est pas ........../NUMBERS/images? Ne serait-ce pas ................/<random ID>/images?

+0

J'utilise ça maintenant. Cela n'a pas d'importance, n'est-ce pas? Je ne définis pas cette valeur, c'était juste pour vous expliquer comment cela a été construit. – Emil