2012-01-24 4 views
0

선생님. iphone에 새로 생겼습니다.이 코드를 사용하여 UITextField를 만들었지 만, dealloc 응용 프로그램에서이 오류를 릴리스 할 때 충돌이 발생합니다. 텍스트 필드를 코딩하여 만들고 싶습니다. 사전에 감사합니다. 이미하여 텍스트 필드 및 레이블을 발표했다iphone-textfield에서 충돌 응용 프로그램이 발생합니다.

#import "TextField.h" 

@implementation TextField 
UILabel *label; 
UITextField *textField; 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    //Create label 
    label = [[UILabel alloc] init]; 
    label.frame = CGRectMake(10, 10, 300, 40); 
    label.textAlignment = UITextAlignmentCenter; 
    label.text = @""; 
    [self.view addSubview:label]; 
    [label release]; 

    // Initialization code 
    textField = [[UITextField alloc] initWithFrame:CGRectMake(10, 200, 300, 50)]; 
    textField.delegate = self; 
    textField.placeholder = @"<Enter Text>"; 
    textField.textAlignment = UITextAlignmentCenter; 
    [self.view addSubview: textField]; 
    [textField release]; 
} 

- (void)dealloc 
{ 
    [textField release]; 
    [label release]; 
    [super dealloc]; 
} 

@end 
+0

당신은 콘솔에서 충돌을 릴리스 레이블과 텍스트 필드를 두 번 ... 게시 할 수 있나요? – NoobMe

답변

1

: 당신이 dealloc method.You에 다시 공개하지 것보다 [textField release]; ,[label release]; 텍스트가 제기 해제하고 라벨과 그 원인 응용 프로그램 충돌에 걸쳐 있습니다. 그냥 dealloc 방법에서 제거하십시오.

0
당신이 [textField release]이있는 장소에 사용하는

: 당신은 배치이이 작업을 수행 할 필요가 없습니다
1)의 viewDidLoad
2)에서의 dealloc 방법
에 있습니다. viewDidLoad 메서드에서 [textField release]을 제거하십시오.

인스턴스를 할당 할 때 보유 수는 1이되고 릴리스 할 때 보유 수는 0이되기 때문입니다. 다시 한번 동일한 인스턴스를 해제하면 충돌이 발생합니다.

+0

죄송합니다 Emil하지만 우리가 addSubview에 의해 view에서 textField를 추가하면 textField가 count를 유지하게됩니다. 왜 2 번 또는 1 번 릴리스해야하는지 생각하고 있습니다. 당신이보기에 추가 할 때 대답 – priya

+0

에 대한 대답 에밀 대답을 주셔서 감사합니다 그렇다면 그것은 2 카운트를 유지합니다.하지만보기가 릴리스되면 모든 하위보기를 릴리스합니다. 따라서 한 번만 textField에서 release를 호출하면됩니다. – Arslan

+0

안녕하세요, 감사합니다 arsalan.u는 모든보기를 모두 해제 한 상태입니다. – priya

0

사용이 코드는 ... u는

#import "TextField.h" 

@implementation TextField 
UILabel *label; 
UITextField *textField; 

- (void)viewDidLoad { 
[super viewDidLoad]; 

//Create label 
label = [[UILabel alloc] init]; 
label.frame = CGRectMake(10, 10, 300, 40); 
label.textAlignment = UITextAlignmentCenter; 
label.text = @""; 
[self.view addSubview:label]; 
[label release]; 

// Initialization code 
textField = [[UITextField alloc] initWithFrame:CGRectMake(10, 200, 300, 50)]; 
textField.delegate = self; 
textField.placeholder = @"<Enter Text>"; 
textField.textAlignment = UITextAlignmentCenter; 
[self.view addSubview: textField]; 
[textField release]; 
} 

@end 
+0

안녕하세요 depeesh 감사합니다,하지만 pls는 우리가 텍스트 필드를 추가 할 때 한 가지를 알려줍니다. textField의 보유 카운터는 2가됩니다. 보유 카운터를 하나 만들려면 두 번 다시 적용해야합니다. – priya

+0

Objective-C는 retain 및 release라는 두 가지 방법을 사용합니다. Objective-C에서 각 객체에는 객체 또는 객체가 사용하는 모든 참조를 추적하는 데 사용되는 내부 카운터가 있습니다. [object retain]은 카운터를 1 씩 증가시키고 [object release]는 카운터를 1 씩 감소시킵니다. 카운터가 0에 도달하면 dealloc이 호출됩니다. – Deepesh

관련 문제