iPhone SDK - 超出范围问题的实例变量

时间:2010-06-28 10:40:19

标签: iphone xcode

我对这个错误感到疯狂。编译器说实例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

3 个答案:

答案 0 :(得分:3)

实际上,如果你设置filename = [NSString stringWithFormat ...],则不会保留自动释放的结果。

但是,如果使用self.filename = [NSString stringWithFormat ...],它将保留字符串。有点看起来字符串是从你下面释放出来的,因为你没有保留它。

答案 1 :(得分:0)

您提到在viewDidLoad方法中初始化变量filename。如果你的意思是nsstring alloc和init方法通过初始化,我不认为你是正确的方式。没有必要初始化合成字符串,或更一般地任何字符串。我不确定你是否通过初始化来表达这个意思,但我基于我从你的问题得到的想法给出了我的意见。

答案 2 :(得分:0)

viewDidLoad真的发生了吗?如果它没有被调用,那将完美地解释recordAudio中的崩溃,因为它尚未初始化。