2010-06-28 4 views
0

Je suis fou de cette erreur. Le compilateur dit hors champ pour une variable NSSString d'instance. Jamais eu cette chose avant et utilisé des milliers de variables d'instance NSString!iPhone SDK - variable d'instance hors de portée problème

Voici mon fichier .h de classe

#import <UIKit/UIKit.h> 
#import <AVFoundation/AVFoundation.h> 
#import <CoreAudio/CoreAudioTypes.h> 
#import "Snapshot.h" 

@interface RecordAudioViewController : UIViewController <AVAudioRecorderDelegate, AVAudioPlayerDelegate> { 
NSString *filename; 
} 

@property (nonatomic, retain) NSString *filename; 

- (IBAction) recordAudio; 
- (IBAction) playAudio; 

@end 

variable est synthétisé correctement. J'initalise la variable filename dans la méthode viewDidLoad. Je veux l'utiliser dans la méthode IBAction recordAudio, mais le compilateur dit toujours hors champ? Pourquoi est-ce, est-ce un bug ou quelque chose?

Voici le code .m. Procédé viewDidLoad où je configurer l'instance nom de variable:

- (void)viewDidLoad { 
    [super viewDidLoad]; 

NSString * tmpdir = NSTemporaryDirectory(); filename = [NSString stringWithFormat: @ "%. 0f.% @", [NSDate timeIntervalSinceReferenceDate] * 1000.0, @ "caf"]; NSLog (nom de fichier); }

Et la méthode IBAction

- (IBAction) recordAudio 
{ 
    NSLog(filename); // here I get out of scope message when moving over with mouse cursor and when steping over this line EXC_BAD_ACCESS 
} 

Le fichier .m entier peut être vu ici: http://pastie.org/1021993

+2

C'est un bug, mais probablement le tien. :-) – Eiko

+0

@Eiko: J'ai ajouté le code dans mon message original. Je l'ai fait mille fois, je ne vois pas où je pourrais me tromper. Le fichier entier .m peut être vu ici: http://pastie.org/1021993 –

+0

Vous devez conserver la variable explicitement ou laisser le sucre syntaxique de la propriété le faire - voir la réponse de mharper. – Eiko

Répondre

3

En fait, si vous définissez filename = [NSString stringWithFormat ...], le résultat de l'auto-libération n'est PAS conservé. Cependant, si vous utilisez self.filename = [NSString stringWithFormat ...], il conservera la chaîne. Kinda a l'air d'être libéré de la chaîne parce que vous ne la retenez pas. Peut-on voir le code du fichier .m?

+0

Ceci est effectivement vrai et je ne savais pas à ce sujet. Merci d'avoir aidé. –

+0

Pas de problème! Heureux d'avoir pu aider. Voici un billet de blog que j'ai écrit sur le sujet il y a quelque temps: http://blog.standalonecode.com/?p=101 et quelques zen que j'ai découvert à propos de retain/release/autotrelease: http://blog.standalonecode.com/? p = 96 – mharper

0

Vous avez mentionné que vous initialisez le nom du fichier variable dans la méthode viewDidLoad. Si vous voulez dire nsstring alloc et init en initialisant les méthodes, je ne pense pas que vous allez dans le bon sens. Il n'est pas nécessaire d'initialiser une chaîne synthétisée, ou plus génériquement des chaînes. Je ne suis pas sûr si vous vouliez dire ceci en initialisant, mais j'ai donné mon opinion basée sur l'idée que j'ai obtenue de votre Ques.

+0

Non avec l'initialisation I set I définit une chaîne dans viewDidLoad. J'utilise [NSString stringWithFormat] pour le faire. –

+0

puis essayez d'utiliser NSLog avant et après la ligne exacte où vous avez besoin de l'utiliser, cela donnera une idée. – Nithin

+0

J'ai essayé ça. Immédiatement après avoir défini la variable de nom de fichier NSString * dans viewDidLoad: filename = [NSString stringWithFormat: @ "%. 0f.% @", [NSDate timeIntervalSinceReferenceDate] * 1000.0, @ "caf"]; NSLog (nom de fichier); la sortie de la console est correcte: "299422764498.caf". Mais quand j'essaye de NSLog (nom de fichier) dans une méthode d'IBAction qui est déclenchée par une pression de bouton j'obtiens: "Programme a reçu le signal:" EXC_BAD_ACCESS "". Si je casse à cette ligne et que je me concentre sur la variable filename, le débogueur dit "out of scope". Comment cela peut-il être? –

0

Est-ce que viewDidLoad se passe réellement? S'il n'est pas appelé, cela expliquerait parfaitement le crash dans recordAudio car il n'a pas été initialisé.

+0

Oui c'est ... Si je me déconnecte NSLog (nom de fichier) dans viewDidLoad alors tout va bien. Mais dans toute autre méthode de cette classe, le nom de fichier var est hors de portée. –