2010-11-14 6 views
0

Quelqu'un pourrait-il me dire pourquoi mon tableau est hors de portée? Voici ma classe:Pourquoi mon instance de tableau est hors de portée?

// Paper.h 
@interface Paper : NSObject { 
    NSMutableArray* items; 
} 

@property (retain) NSMutableArray* items; 

// Paper.m 
#import "Paper.h" 
@implementation Paper { 
@synthesize items; 
} 

// ParserUtil.m 
@implementation ParserUtil { 
+(Paper*) parsePaper:(NSString*)file { 
... 
Paper* paper = [[[Paper alloc] init] autorelease]; 
// does the following line is the best practice? 
paper.items = [[[MutableArray alloc] init] autorelease]; 

Item* item = ...; // create item instance 
[paper.items addObject:item]; 

return paper; 
} 

// call the parser method 
... 
Paper* paper = [[ParserUtil parsePaper:@"SomeFile"] retain]; 
// when run to this line, the paper.items is out of scope 
// seems all the items in the array are dispear 
NSMutableArray* items = paper.items; 
... 

Quelqu'un pourrait-il indiquer ce qui cloche? Merci beaucoup!

+0

Votre syntaxe est omniprésente dans cet exemple. '@ implementation' se termine par' @ end', pas avec des accolades. Notez également que plutôt que [[[NSMutableArray alloc] init] autorelease] 'vous pouvez tout aussi bien utiliser' [NSMutableArray array] '. – d11wtq

+0

@end ne sont pas collés ici. Je ne veux pas coller toutes les lignes de code ici. Pourriez-vous préciser quels pourraient être les problèmes? Merci quand même. – icespace

+0

icespace: Non, car vous n'avez pas montré le code où se situe le problème. Très probablement, le problème est un déséquilibre syntaxique entre le code que vous avez montré et le code que vous n'avez pas. –

Répondre

5

Ce n'est pas le cas.

Un objet ne peut pas être hors de portée, car les objets n'ont pas d'étendue. Ce qu'ils peuvent être est inaccessible, ce qui arrive quand vous n'avez aucune variable contenant le pointeur de l'objet.

Les variables peuvent être hors de portée. Vous ne pouvez utiliser une variable que dans la même étendue que celle dans laquelle vous l'avez déclarée; vous ne pouvez pas commencer une instruction composée, déclarer une variable, terminer l'instruction composée et utiliser la variable, et vous ne pouvez pas déclarer une variable dans une fonction ou une méthode, puis l'utiliser dans une variable différente.

Vous avez dit dans your other question que c'est le débogueur qui vous dit que la variable est hors de portée. Cela signifie que l'un des deux trois choses:

  1. La variable est vraiment hors de portée. Déplacez la variable ou déplacez le code qui l'utilise, ou interrompez simplement le débogueur plus tôt (avec un point d'arrêt, si nécessaire).
  2. Le débogueur est juste stupide. Cela arrive beaucoup. Essayez la commande po ou saupoudrez votre code avec des instructions NSLog à la place.
  3. Vous essayez d'examiner une expression d'accès à une propriété. Une expression d'accès à la propriété, par définition, doit envoyer un message accesseur, qui peut avoir des effets secondaires; pour cette raison, le débogueur ne le fera pas juste pour vous planer sur l'expression, parce que c'est trop facile à faire par accident. Vous devez utiliser la commande po dans la console du débogueur pour envoyer le message d'accesseur et imprimer la description du résultat.
+0

Merci, je vais vérifier le code en fonction de vos commentaires. La chose étrange est l'instance de papier est un pointeur valide, mais le paper.items est hors de portée. Je suppose que le pointeur variable est libéré ou en quelque sorte devenu invalide. Comme vous l'avez dit, le code que j'ai collé ici n'est pas beau, mais puisque vous n'avez pas indiqué ce qui ne va pas dans le code, au moins je sais que les erreurs sont dans d'autres parties de notre code. Je vais mettre à jour le fil quand j'ai trouvé sth. Merci encore les gars. – icespace

+0

@icespace: 'paper.items' est hors de portée car c'est une expression d'accès à la propriété. Récupérer cela provoquerait un message d'accesseur, qui, parce que les accesseurs peuvent avoir des effets secondaires, le débogueur ne fera pas sans votre commande explicite. Planer au-dessus de l'expression n'est pas assez explicite; vous devez l'inspecter en utilisant la commande 'po'. –

+0

(Et oui, c'est une application très "hors de portée" Le débogueur devrait vraiment dire quelque chose de différent pour les expressions d'accès à la propriété, tant que la variable à la racine de l'expression est dans la portée.) –

Questions connexes