2012-02-14 1 views
0
#import "Mutation.h" //my class 

@implementation NTAppDelegate 

왜 _mutation하지 컨트롤러이 코드의 인스턴스 범위는 무엇입니까? 범위 문제로 인해 충돌이 발생합니까?

@synthesize window = _window; 
@synthesize dataField = _dataField; 
@synthesize OutputField = _OutputField; 

@synthesize mutation; 

로 응용 프로그램 대리자를 사용하고 계십니까?

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification 
{ 
Mutation *aMutation = [[Mutation alloc] init]; 
[self setMutation:aMutation]; 
[self.mutation setInputString:@"new"]; 
[self.mutation setOutputString:@"old"]; 
NSLog(@"Mutation inputString is %@; outputString is %@",[mutation inputString],[mutation outputString]); 
} 

getUserText은 ... 텍스트 필드 입력 문자열을 내 돌연변이 개체에 바르로 스틱 가정 NSControl EUREKA에서

- (IBAction)getUserText:(NSTextField *)sender 
{ 
// assign the users entered text to mutation's inputString 
NSString* newText = [sender stringValue]; 

-stringValue INH입니다!

NSLog (@"%@ was entered", newText); 

위는

[mutation setInputString:newText]; 

위의 충돌, 나쁜 판매를 WORKS? 돌연변이를 호출 할 수 없습니다. }

+1

범위 문제로 인해 충돌이 발생하지 않습니다. 컴파일러 오류가 발생합니다. 마지막으로 게시 한 행은 어디에 있는가 ('[mutation setInputString : newText]')? –

+0

'getUserText'에 있습니다 (해당 줄 다음에 닫는 중괄호를 포함하는 것을 잊었습니다). 당신이 가장 정확합니다, 괜찮아요, 컴파일하지만 'getUserText'(하지만 appDidFinish ...)에서 변이에 ivars에 액세스하려고 언제든지 덤프. 그래서 나는 사물을 선언 한 방법과 장소에 대해 우려하고 있습니다. 나는 "atreat"(첫 번째 대답)가 동의한다고 생각합니다. 다른 포인터를 보내주십시오! 고마워 –

+2

BTW : 매우 구체적인 패턴을 따르지 않는 한 어떤 메소드도'get *'접두어를 붙여야합니다. – bbum

답변

0

나는 _mutation이 순전히 선호의 문제라고 말할 수 있습니다. mutation이라는 이름의 인스턴스 변수를 만드는 속성 대신 _mutation이라는 이름의 인스턴스를 만듭니다. 로컬로 생성 된 변수와 인스턴스 변수를 구별 할 때 당신이 할 수있는 일을 @synthesize 때 목표 C에서

(당신이 self.mutation를 작성하지 않아도 그것을 유추되는 인스턴스 변수이기 때문에)이 도움이됩니다 인스턴스 변수의 이름을 지정하십시오. 그래서 쓸 수 있습니다 : @synthesize mutation = thisIsMyMutation;

코드가 충돌하는 이유는 강하게 입력되도록 선언 할 때 속성을 유지하기 때문입니다. 객체를 유지해야하므로 선언에서 retain을 제거하지 마십시오. 대신 코드를 다시 작성하여 사용하기 전에 속성에 메모리를 할당하십시오.

self.mutation = [[Mutation alloc] init]; 
[self.mutation setInputString:@"new"]; 
[self.mutation setOutputString:@"old"]; 

요약 : 귀하의 문제는 귀하가이 속성에 대해 메모리를 할당하지 않는다는 사실에 있다고 생각됩니다. 이것은 일반적으로 init 함수에서 수행됩니다. didFinishLaunching에서 앱을 실행하면 위젯이 위임되므로 위의 코드는 정상적으로 작동합니다.

+1

실제로 메모리는 원래 코드로 할당됩니다. 실제로, OP와 코드는 완전히 동등하며 누출의 원인이됩니다. –

+0

감사합니다. 속성 설명을 확인하겠습니다. –

관련 문제