(Réglé) Erreur récupération valeur d'un tableau ([__NSCFString objectAtIndex:]: unrecognized
Bonjour à tous,
J'ai encore aujourd'hui un souci pour récupérer la valeur de mon tableau (NSArray*)
NSArray* imgLink=_listePhotos;
NSLog(@Tab imgLink: %@", imgLink);
//renvoie Tab imgLink: 2014/04/18/i7e4m4286v.jpg
NSLog(@imgLink obj1: %@", [imgLink objectAtIndex:0]);
mon .h
@property(nonatomic,retain) NSArray* listePhotos;
Il me plante l'appli et me dit cela:
2014-04-18 16:09:14.563 Appli[4084:60b] -[__NSCFString objectAtIndex:]: unrecognized selector sent to instance 0x10924f030
2014-04-18 16:09:14.565 Appli[4084:60b] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFString objectAtIndex:]: unrecognized selector sent to instance 0x10924f030'
*** First throw call stack:
(
0 CoreFoundation 0x0000000101d0e495 __exceptionPreprocess + 165
1 libobjc.A.dylib 0x0000000101a6d99e objc_exception_throw + 43
2 CoreFoundation 0x0000000101d9f65d -[NSObject(NSObject) doesNotRecognizeSelector:] + 205
3 CoreFoundation 0x0000000101cffd8d ___forwarding___ + 973
4 CoreFoundation 0x0000000101cff938 _CF_forwarding_prep_0 + 120
5 Appli 0x000000010001acee -[ZoomPhoto viewDidLoad] + 158
6 UIKit 0x000000010071059e -[UIViewController loadViewIfRequired] + 562
7 UIKit 0x00000001007313cd -[UINavigationController _layoutViewController:] + 44
8 UIKit 0x00000001007318dd -[UINavigationController _updateScrollViewFromViewController:toViewController:] + 216
9 UIKit 0x00000001007319dd -[UINavigationController _startTransition:fromViewController:toViewController:] + 83
10 UIKit 0x0000000100732787 -[UINavigationController _startDeferredTransitionIfNeeded:] + 547
11 UIKit 0x0000000100733238 -[UINavigationController __viewWillLayoutSubviews] + 43
12 UIKit 0x000000010084d895 -[UILayoutContainerView layoutSubviews] + 202
13 UIKit 0x000000010067a993 -[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 354
14 QuartzCore 0x0000000104a30802 -[CALayer layoutSublayers] + 151
15 QuartzCore 0x0000000104a25369 _ZN2CA5Layer16layout_if_neededEPNS_11TransactionE + 363
16 QuartzCore 0x0000000104a251ea _ZN2CA5Layer28layout_and_display_if_neededEPNS_11TransactionE + 24
17 QuartzCore 0x0000000104998fb8 _ZN2CA7Context18commit_transactionEPNS_11TransactionE + 252
18 QuartzCore 0x000000010499a030 _ZN2CA11Transaction6commitEv + 394
19 UIKit 0x0000000100619024 _UIApplicationHandleEventQueue + 10914
20 CoreFoundation 0x0000000101c9dd21 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 17
21 CoreFoundation 0x0000000101c9d5f2 __CFRunLoopDoSources0 + 242
22 CoreFoundation 0x0000000101cb946f __CFRunLoopRun + 767
23 CoreFoundation 0x0000000101cb8d83 CFRunLoopRunSpecific + 467
24 GraphicsServices 0x0000000103d3ff04 GSEventRunModal + 161
25 UIKit 0x000000010061ae33 UIApplicationMain + 1010
26 Appli 0x000000010001b763 main + 115
27 libdyld.dylib 0x00000001023a65fd start + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException
(lldb)
Merci d'avance à ceux qui m'aideront
Réponses
Le problème est que pour lui, imgLink est un NSString. Du coup, objectAtIndex: n'est pas une méthode de NSString.
D'ailleurs, c'est ce qu'on remarque quand tu fais ton premier NSLog, cela n'as rien à voir avec un NSArray.
Et pourtant quand je met
Il me met ce warning
ça veut juste dire que le compile pense savoir que _listePhotos est un NSArray (d'après les infos que tu lui as données).
Mais le problème c'est que dans cette variable, tu as mis autre chose qu'un NSArray !!!
Vas voir là tu donne sa valeur à _listePhotos.
Je présume que tu parle de cela
Non, je ne vois pas de traces de _listePhotos
Au temps pour moi c'est ici:
Et OffreDetails, c'est quoi exactement ? J'ai l'impression que c'est un NSArray de NSString. Du coup, c'est pas un NSArray de NSArray.
C'est donc un NSArray dans lequel tu as mis des NSString.
Donc quand tu fais:
zoom.listePhotos=[_Offredetail objectAtIndex:1];
Tu lui as mis le premier NSString qu'il contenait.
Donc pas de méthode objectAtIndex: pour lui.
Dans ce cas pourquoi il me met ça alors ?
Car tu lui dis : mets un NSArray* dans un NSString*
Car le compilo sait que _listePhotos est un NSArray*, c'est toi qui le lui a dit.
Mais ailleurs dans ton programme, tu donnes une mauvaise valeur à _listePhotos.
C'est là que le compilo devrait râler et dire ! "Non mais tu essaies de mettre un NSString* dans un NSArray*"
Il ne râle pas car tu mets un (id) dans _listePhotos, donc le compilo n'a pas moyen de vérifier les types, il te fait confiance pour ne pas faire n'importe quoi.
Pourquoi c'est un (id) ? Car c'est le résultat de objectAtIndex:0... C'est un donc un "objet en général", c'est un (id), on ne connaà®t pas son type.
Si tu veux vraiment exécuter ta ligne, il faut faire
EDIT :
C'est un peu comme si tu appelais ton fils "Télévision" et que tu t'étonnes qu'il ne s'allume pas quand tu appuies sur la télécommande.
Merci ça marche bien
En tout cas merci à vous 2 pour votre aide
Commencer par le début en potassant un bouquin de Cocoa pour apprendre et maà®triser les concepts de base?
Et tu ne maà®trises pas le simple fait de manipuler des données dans un NSArray? ???