2012-03-01 3 views
0

저는 방금 Objective C/Cocoa를 배우기 시작했고 메모리 관리가 얼마나 중요한지 알고 있습니다. 나는이 오류에 대해 생각하고 있습니다.프로그램 수신 신호 : EXC_BAD_ACCESS. 이것으로 무엇을 할 것인가?

두 개의 UITextView, 하나의 Button, 하나의 UILabel이있는 매우 간단한 화면이 있습니다.

@interface PontaiViewController : UIViewController { 

UITextField *loginField; 
UITextField *passwordField; 
UILabel *userID; 

} 

@property (nonatomic, retain) IBOutlet UITextField *loginField; 
@property (nonatomic, retain) IBOutlet UITextField *passwordField; 
@property (nonatomic, retain) IBOutlet UILabel *userID; 


- (IBAction) btnLoginClicked:(id) sender; 

구현이 있습니다 :

내 헤더 파일이

@implementation PontaiViewController 
@synthesize loginField; 
@synthesize passwordField; 
@synthesize userID; 
-(IBAction) btnLoginClicked:(id)sender { 
NSString *string1 = @"username="; 
NSString *string2 = [string1 stringByAppendingString:(loginField.text)]; 
NSString *string3 = [string2 stringByAppendingString:(@"&password=")]; 
NSString *post = [string3 stringByAppendingString:(passwordField.text)]; 
NSLog(@"The post is %@", post); 
userID.text=loginField.text; 
[string1 release]; 
[string2 release]; 
[string3 release]; 
[post release]; 

}

나는이 데모를 실행하면 그것은

- (void)viewDidUnload 
{ 
    [super viewDidUnload]; 
    // Release any retained subviews of the main view. 
    // e.g. self.myOutlet = nil; 
    self.loginField=nil; 
    self.passwordField=nil; 
    self.userID=nil; 
} 

- (void) dealloc { 
    [super dealloc]; 
    [loginField release]; 
    [passwordField release]; 
    [userID release]; 
} 

으로 완료하고, 쓴다. TextView에서 __LW_AT__이 오류가 발생합니다.

무엇이 될 수 있습니까?

감사합니다, viewDidUnload에서 펠리페

+0

정확히 어디에서 오류가 발생합니까? 'userID.text = loginField.text; '에? 그렇다면 Interface Builder에서'userID' 필드를 연결했는지 확인하십시오? –

답변

2

당신이 loginFieldnil에 설정은, 당신은 dealloc에 출시하려고합니다. 이것은 옳지 않습니다. 자신이 소유 한 유효한 항목 만 릴리스하면됩니다.

또한 (설명에서 지적한대로) dealloc 함수 끝에 [super dealloc]을 입력해야합니다.

다른 사람들이 지적한대로 stringByAppendingString에서 가져 오는 문자열을 공개해서는 안됩니다. 여기

는 아이폰 OS에서 목표 - C에서 메모리를 관리하는 방법에 대한 몇 가지 기본 규칙입니다 : 당신은 당신이 책임이 있습니다 물건을 해제 것을 당신은 발견 할 것이다

https://developer.apple.com/library/ios/#documentation/general/conceptual/devpedia-cocoacore/MemoryManagement.html

한 가지, 당신은있어 이 이들 중 하나를 생성하지 않는 한에 대한 책임을지지 않습니다 :

ALLOC, allocWithZone :, 복사, copyWithZone :, mutableCopy, mutableCopyWithZone

+0

나는 을 본다 나는 '보유'keywoard로 또한 창조 한 목표에 책임 있었다는 것을 나는 생각했다. 팁 주셔서 감사합니다! –

+0

예! Obj-C의 메모리 관리는 일반적인 C/C++과 매우 다르며 처음에는 배우기가 까다로울 수 있습니다. – Almo

3

또한, 당신의 NSStrings는 오토 릴리즈되어, 다음 ' 다시 풀어 놓는다. 편리한 방법의 메모리 관리에 대해 읽어보십시오.

+0

또한 시도해보십시오 :'NSString * post = [NSString stringWithFormattedString : @ "username = % @ & password = % @", loginField.text, passwordField.text]; 그리고이 예제로 포스트를 해제하지 마십시오. – dbrajkovic

+1

또한'[super dealloc];은 마지막으로 가야합니다. – dbrajkovic

+0

고마워! 고맙다. –

2

stringByAppendingStringstring1, string2, string3post를 해제하지 않는, 오토 릴리즈 개체를 반환합니다.

1

당신은 당신이 헬퍼 메소드를 사용하여 명시 적으로 아무 것도 할당되지 않은 이후

//[string1 release]; 
//[string2 release]; 
//[string3 release]; 
//[post release]; 

을 다음 주석해야한다.

관련 문제