2010-06-28 7 views
0

이 오류가 발생했습니다. 컴파일러는 인스턴스 NSSString 변수의 범위를 벗어났습니다. 전에는 이런 일이 없었으며 수천 개의 NSString 인스턴스 변수를 사용했습니다.iPhone SDK - 인스턴스 변수가 범위를 벗어남 문제

여기

#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 

변수가 제대로 합성 내 클래스 .H 파일입니다. viewDidLoad 메서드에서 파일 이름 변수를 초기화합니다. IBAction 메서드 인 recordAudio에서 사용하고 싶지만 컴파일러는 항상 범위를 벗어납니다. 왜 그게, 벌레 일까?

여기에 .m 코드가 있습니다. I는 파일명 인스턴스 변수 세트의 viewDidLoad 방법 :

- (void)viewDidLoad { 
    [super viewDidLoad]; 

는 NSString * TMPDIR = NSTemporaryDirectory을(); filename = [NSString stringWithFormat : @ "% .0f. % @", [NSDate timeIntervalSinceReferenceDate] * 1000.0, @ "caf"]; NSLog (파일 이름); }

그리고 IBAction를 방법 전체하는 .m 파일이 여기에서 볼 수 있습니다

- (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 
} 

: http://pastie.org/1021993

+2

.m 파일의 코드를 볼 수 있습니까? 버그 일 뿐이지 만, 아마도 당신 것입니다. :-) – Eiko

+0

@ 에코 : 원본 게시물에 코드를 추가했습니다. 나는이 일을 천 번 했어. 어디서 잘못 될 수 있는지 모르겠다. 전체 .m 파일은 다음에서 볼 수 있습니다. http://pastie.org/1021993 –

+0

변수를 명시 적으로 유지하거나 속성의 구문 설탕으로 처리해야합니다 (mharper의 대답 참조). – Eiko

답변

3

사실, filename = [NSString stringWithFormat ...]을 설정하면 자동으로 렌더링 된 결과가 유지되지 않습니다.

그러나 self.filename = [NSString stringWithFormat ...]을 사용하면 문자열이 유지됩니다. 당신이 그것을 지키고 있지 않기 때문에 문자열은 당신 아래에서 풀려나고있는 것처럼 보입니다.

+0

이것은 실제로 사실이며 나는 그것에 대해 몰랐습니다. 도와 줘서 고마워. –

+0

괜찮습니다! 다행히 도울 수있어. http://blog.standalonecode.com/?p=101과 내가 보유/릴리스/autotrelease : http://blog.standalonecode.com/에 대해 발견 한 선 (禅)은 얼마 전 주제에 관해 쓴 블로그 게시물이 있습니다. p = 96 – mharper

0

당신은 당신이있는 viewDidLoad 메소드에서 변수 이름을 초기화 언급했다. 당신이 nsstring alloc과 init 메소드를 초기화하는 것을 의미한다면, 나는 당신이 올바른 방법으로 가고 있다고 생각하지 않는다. 합성 된 문자열 또는 더 일반적으로 모든 문자열을 초기화 할 필요는 없습니다. 나는 당신이이 초기화를 의미하는지의 여부를 확신하지 못하지만, 나는 당신의 Ques에서 얻은 생각을 바탕으로 제 의견을 밝혔습니다.

+0

초기화하지 않음 viewDidLoad에 문자열을 설정했습니다. 나는 그것을하기 위해 [NSString stringWithFormat]을 사용한다. –

+0

다음 NSLog를 사용하려고하는 정확한 행의 전후에 사용하십시오. 이는 약간의 아이디어를 줄 것입니다. – Nithin

+0

나는 그것을 시험해 보았다. 즉시 viewDidLoad에서 NSString * 파일 이름 변수를 설정 한 후 : filename = [NSString stringWithFormat : @ "% .0f. % @", [NSDate timeIntervalSinceReferenceDate] * 1000.0, @ "caf"]; NSLog (파일 이름); 콘솔 출력이 정확합니다 : "299422764498.caf". 그러나 버튼 탭에 의해 트리거되는 IBAction 메소드에서 NSLog (파일 이름)를 시도하면 "프로그램 수신 신호 :"EXC_BAD_ACCESS ""가됩니다. 그 줄에서 깨지고 파일 이름 변수에 집중하면 디버거는 "범위를 벗어났습니다"라고 말합니다. 어떻게 그렇게 될수 있니? –

0

실제로 viewDidLoad가 발생합니까? 그것이 호출되지 않으면 recordAudio가 초기화되지 않았기 때문에 완벽하게 충돌을 설명 할 것입니다.

+0

네, 그렇습니다 ... viewDidLoad에서 NSLog (파일 이름)를 로그 아웃하면 모든 것이 정상입니다. 그러나이 클래스의 다른 메소드에서는 파일 이름 var가 범위를 벗어납니다. –

관련 문제