2010-05-18 4 views
3

Pourquoi une erreur "hors de portée" est-elle détectée lorsque j'essaie d'accéder à la variable "url" dans cette boucle?Erreur "hors de portée" lors de l'itération d'un NSMutableArray

for(NSString *url in self.winnerImageURLs) { 
     [mediaItemString appendFormat:@"{\"type\":\"image\",\"src\":\"%@\",\"href\":\"%@\"},", url, url]; 
    } 

La classe d'élément dans les très « self.winnerImageURLs » NSMutableArray revient comme NSCFString donc je ne suis pas sûr de ce que l'dealio est ici.

Des idées sur ce que je fais mal ???

Merci

+1

Cela ressemble à un problème de débogueur. Avez-vous essayé d'utiliser NSLog pour déterminer si la chaîne que vous construisez semble être correcte? – warrenm

+0

Yup. A NSLog quand j'ai ajouté le NSString dans le tableau mutable .. et dans le débogueur assuré qu'il y a un seul élément dans le tableau de type NSCFString. – wgpubs

+1

Je ne suis pas sûr de comprendre le problème. Si vous êtes concerné par le type lui-même, NSCFString est le type d'instance sous-jacent des instances de NSString et CFString pour prendre en charge le pont entre les frameworks Cocoa. – warrenm

Répondre

1

Si vous parlez l'accès à la variable URL dans le débogueur, il arrive assez souvent. Ce n'est pas un problème en soi.

1

Courte anwer est qu'il est censé être comme ça. Une réponse plus longue est que NSString est un cluster de classe.

cluster classe

Un cluster de classe est une architecture qui regroupe un certain nombre de particuliers, sous-classes concrètes en public, superclasse abstraite. Le regroupement de classes fournit ainsi une interface simplifiée à l'utilisateur, qui ne voit que l'architecture visible publiquement. Dans les coulisses, cependant, la classe abstraite appelle jusqu'à la sous-classe privée la plus adaptée pour effectuer une tâche particulière.

Beaucoup Cocoa communes les classes sont mises en œuvre en tant que groupes de classe, y compris NSArray, NSString et NSDictionary.

Vous créez et interagissez avec des instances du cluster comme vous le feriez avec n'importe quelle autre classe. Dans les coulisses, cependant, lorsque vous créez une instance de la classe publique, la classe renvoie un objet de la sous-classe appropriée en fonction de la méthode de création que vous appelez. (Vous ne le faites pas, et ne peut pas, choisir la classe réelle de l'instance.)

NSString exemple

NSString *a = @"UTF32.txt"; 

NSString *b = [NSHomeDirectory() stringByAppendingPathComponent:a]; 

NSTextStorage *storage = [[NSTextStorage alloc] initWithString:b]; 

NSString *c = [storage string]; 

Chacun a, b et c est peut-être (et 10,5 est) une instance d'une sous-classe privée différente (et en fait, sur Mac OS X v10.5, chacun est). Bien que chacun des objets soit d'une sous-classe privée de NSString, il est pratique de considérer chacun des objets comme des instances de la classe NSString.

À propos clusters de classe dans Apple site des développeurs: http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/CocoaFundamentals/CocoaObjects/CocoaObjects.html#//apple_ref/doc/uid/TP40002974-CH4-SW34

Questions connexes