我对这个错误感到疯狂。编译器说实例NSSString变量的范围超出范围。从来没有过这个东西,并且使用过数千个NSString实例变量!
这是我的班级.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方法中初始化filename变量。我想在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
答案 0 :(得分:3)
实际上,如果你设置filename = [NSString stringWithFormat ...],则不会保留自动释放的结果。
但是,如果使用self.filename = [NSString stringWithFormat ...],它将保留字符串。有点看起来字符串是从你下面释放出来的,因为你没有保留它。
答案 1 :(得分:0)
您提到在viewDidLoad方法中初始化变量filename。如果你的意思是nsstring alloc和init方法通过初始化,我不认为你是正确的方式。没有必要初始化合成字符串,或更一般地任何字符串。我不确定你是否通过初始化来表达这个意思,但我基于我从你的问题得到的想法给出了我的意见。
答案 2 :(得分:0)
viewDidLoad真的发生了吗?如果它没有被调用,那将完美地解释recordAudio中的崩溃,因为它尚未初始化。