【问题标题】:iPhone SDK - instance variable out of scope issueiPhone SDK - 实例变量超出范围问题
【发布时间】:2010-06-29 00:38:20
【问题描述】:

我对这个错误感到抓狂。编译器说实例 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 方法中初始化文件名​​变量。我想在 IBAction 方法 recordAudio 中使用它,但编译器总是说超出范围?这是为什么呢,是bug还是什么?

这是 .m 代码。我设置文件名实例变量的 viewDidLoad 方法:

- (void)viewDidLoad {
    [super viewDidLoad];

NSString *tmpDir = NSTemporaryDirectory(); 文件名 = [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

【问题讨论】:

  • 我们能看到.m文件的代码吗?这是一个错误,但很可能是你的。 :-)
  • @Eiko:我已经在我的原始帖子中添加了代码。我已经做了一千次了,我不知道哪里会出错。整个 .m 文件可以在这里看到:pastie.org/1021993
  • 您需要显式保留变量或让属性的语法糖执行此操作 - 请参阅 mharper 的答案。

标签: iphone xcode


【解决方案1】:

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

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

【讨论】:

【解决方案2】:

您提到您在 viewDidLoad 方法中初始化了变量文件名。如果您通过初始化来表示 nsstring alloc 和 init 方法,我认为您的方法不正确。不需要初始化合成字符串,或者更一般地说任何字符串。我不确定您是否通过初始化来表示这个,但我根据您从您的问题中得到的想法给出了我的意见。

【讨论】:

  • 没有初始化我在 viewDidLoad 中设置了一个字符串。我使用 [NSString stringWithFormat] 来做到这一点。
  • 然后尝试在你需要使用它的确切行之前和之后使用 NSLog,这会给你一些想法。
  • 我试过了。紧接着我在 viewDidLoad 中设置了 NSString *filename 变量:filename = [NSString stringWithFormat:@"%.0f.%@", [NSDate timeIntervalSinceReferenceDate] * 1000.0, @"caf"]; NSLog(文件名);控制台输出正确:“299422764498.caf”。但是当我尝试在由按钮点击触发的 IBAction 方法中使用 NSLog(filename) 时,我得到:“程序接收到的信号:“EXC_BAD_ACCESS””。如果我在该行中断并专注于文件名变量,调试器会说“超出范围”。怎么可能?
  • 好吧,我不在这里回答你的问题,但如果你声明一个属性,最好使用 self.propertyname 或在你的情况下使用 self.filename 来访问它。另外,如果您想要更明确的答案,请编辑您的问题并粘贴您初始化字符串的代码部分。
  • 嘿卢基亚。没必要粗鲁。我尝试的第一件事是使用“self.filename”。没有不同。 “自己。”不是您需要为实例变量使用的东西,苹果文档清楚地说明了这一点。正如你所说,我已经用代码修改了我的帖子。
【解决方案3】:

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

【讨论】:

  • 是的...如果我在 viewDidLoad 中注销 NSLog(filename) 则一切正常。但在此类中的任何其他方法中,文件名 var 超出范围。
猜你喜欢
  • 1970-01-01
  • 2012-04-04
  • 2011-08-22
  • 2016-04-30
  • 1970-01-01
  • 1970-01-01
  • 2010-12-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多