2010-06-28 2 views
0

Я схожу с ума по этой ошибке. Компилятор говорит вне области действия для переменной экземпляра NSSString. Никогда раньше этого не было и использовали тысячи переменных экземпляра NSString!iPhone SDK - переменная экземпляра вне области выпуска

Вот мой файл .h класс

#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 синтезируется правильно. Я инициализирую переменную имени файла в методе viewDidLoad. Я хочу использовать его в методе IBAction recordAudio, но компилятор всегда говорит о нераспространении? Почему это, это ошибка или что-то еще?

Это код .m. Метод viewDidLoad где я установить имя файла переменную экземпляра:

- (void)viewDidLoad { 
    [super viewDidLoad]; 

NSString * TmpDir = NSTemporaryDirectory(); filename = [NSString stringWithFormat: @ "%. 0f.% @", [NSDate timeIntervalSinceReferenceDate] * 1000.0, @ "caf"]; NSLog (имя файла); }

И метод 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 
} 

Весь файл .m можно увидеть здесь: http://pastie.org/1021993

+2

Можем ли мы видеть код файла .m? Это черепашка, но, скорее всего, ваша. :-) – Eiko

+0

@Eiko: Я добавил код в свой оригинальный пост. Я сделал это тысячу раз, я не вижу, где я могу пойти не так. Весь файл .m можно увидеть здесь: http://pastie.org/1021993 –

+0

Вам нужно сохранить переменную либо явно, либо позволить синтаксическому сахару свойства сделать это - см. Ответ mharper. – Eiko

ответ

3

На самом деле, если вы задали имя файла = [NSString stringWithFormat ...], автореализованный результат НЕ сохраняется.

Однако, если вы используете self.filename = [NSString stringWithFormat ...], он сохранит строку. Кажется, что Kinda выглядит так, что строка выходит из-под вас, потому что вы ее не сохраняете.

+0

Это действительно так, и я не знал об этом. Спасибо за помощь. –

+0

Нет проблем! Рад, что смог помочь. Вот сообщение в блоге, которое я написал о предмете некоторое время назад: http://blog.standalonecode.com/?p=101 и некоторые дзэн, которые я открыл о сохранении/выпуске/autotrelease: http://blog.standalonecode.com/? р = 96 – mharper

0

Вы упомянули, что вы инициализировать переменную файла в методе viewDidLoad. если вы имеете в виду nsstring alloc и init методы инициализации, я не думаю, что вы идете правильно. Нет необходимости инициализировать синтезированную строку или, более всего, любые строки. Я не уверен, что вы имели в виду это, инициализируя, но я дал свое мнение, основанное на идее, что я получил от вашего Ques.

+0

Нет с инициализацией Я установил строку в viewDidLoad. Для этого я использую [NSString stringWithFormat]. –

+0

, попробуйте использовать NSLog до и после точной строки, где вам нужно его использовать, что даст некоторую идею. – Nithin

+0

Я пробовал это. Сразу после того, как я установил переменную имени NSString * filename в viewDidLoad: filename = [NSString stringWithFormat: @ "%. 0f.% @", [NSDate timeIntervalSinceReferenceDate] * 1000.0, @ "caf"]; NSLog (имя файла); вывод консоли правильный: «299422764498.caf». Но когда я пытаюсь NSLog (имя файла) в методе IBAction, который запускается нажатием кнопки, я получаю: «Программный принятый сигнал:« EXC_BAD_ACCESS »». Если я сломаюсь на этой строке и сосредоточусь на переменной имени файла, отладчик говорит «вне сферы действия». Как это может быть? –

0

Действительно ли viewDidLoad происходит? Если он не вызван, это прекрасно объяснит крах в recordAudio, поскольку он не был инициализирован.

+0

Да, это ... Если я выхожу из NSLog (filename) в viewDidLoad, тогда все будет в порядке. Но в любом другом методе этого класса имя файла var выходит за рамки. –

Смежные вопросы