2010-06-28 90 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 

變正常合成。我在viewDidLoad方法中初始化文件名​​變量。我想在IBAction方法recordAudio中使用它,但編譯器總是說超出範圍?爲什麼呢,這是一個錯誤還是什麼?

這裏是.m代碼。 viewDidLoad方法,其中我設置文件名實例變量:

- (void)viewDidLoad { 
    [super viewDidLoad]; 

的NSString * TMPDIR = NSTemporaryDirectory(); filename = [NSString stringWithFormat:@「%。0f。%@」,[NSDate timeIntervalSinceReferenceDate] * 1000.0,@「caf」]; NSLog(filename); }

而且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文件的代碼嗎?這是一個bug,但最可能是你的。 :-) – Eiko 2010-06-28 10:48:33

+0

@Eiko:我在原帖中添加了代碼。我做了這一千次,我沒有看到我可能出錯的地方。您可以在這裏看到整個.m文件:http://pastie.org/1021993 – 2010-06-28 16:22:01

+0

您需要明確保留變量或讓屬性的語法糖做到這一點 - 請參閱mharper的答案。 – Eiko 2010-06-28 20:40:51

回答

3

實際上,如果你設置文件名= [NSString stringWithFormat ...],自動釋放的結果不會被保留。但是,如果使用self.filename = [NSString stringWithFormat ...],它將保留該字符串。有點看起來像是從你下面釋放出來的弦,因爲你沒有保留它。

+0

這其實是真的,我不知道它。感謝您的幫助。 – 2010-06-30 12:15:25

+0

沒問題!很高興我能幫上忙。以下是我前段時間撰寫的有關此主題的博客文章:http://blog.standalonecode.com/?p=101和我發現的關於保留/發佈/自動發佈的一些禪宗:http://blog.standalonecode.com/? p = 96 – mharper 2010-06-30 18:41:31

0

你提到初始化viewDidLoad方法的變量名。如果你的意思是通過初始化nsstring alloc和init方法,我認爲你沒有走正確的道路。沒有必要初始化一個合成的字符串,或更一般的任何字符串。我不確定你的初始化是否意味着這一點,但我根據我從你的問答中得到的想法給出了我的看法。

+0

否與初始化I ment我在viewDidLoad中設置一個字符串。我使用[NSString stringWithFormat]來做到這一點。 – 2010-06-28 12:10:48

+0

然後嘗試使用NSLog前後確切的行,你需要使用它,這將給一些想法。 – Nithin 2010-06-28 12:42:14

+0

我試過了。立即在我設置NSString * filename變量在viewDidLoad中: filename = [NSString stringWithFormat:@「%。0f。%@」,[NSDate timeIntervalSinceReferenceDate] * 1000.0,@「caf」]; NSLog(filename); 控制檯輸出正確:「299422764498.caf」。但是,當我嘗試NSLog(文件名)在一個IBAction方法,由按鈕觸發我得到:「程序接收到的信號:」EXC_BAD_ACCESS「」觸發。如果我在該行中斷並關注文件名變量,調試器會說「超出範圍」。怎麼可能? – 2010-06-28 13:02:03

0

viewDidLoad究竟發生了什麼?如果它沒有被調用,這將很好地解釋recordAudio中的崩潰,因爲它沒有被初始化。

+0

是的,這是...如果我註銷NSLog(文件名)在viewDidLoad然後一切都很好。但是在這個類中的其他方法中,文件名var超出了範圍。 – 2010-06-28 16:43:51