2012-06-06 3 views
-1

간단한 iPhone 응용 프로그램을 만들려고 노력 중이며 최근에 기능을 사용하여 놀았습니다. 분명히 "좋은 코드"로 인해 exc_bad_access로 인해 내 앱이 중단되기 때문에 메모리 관리와 관련하여 혼란 스럽습니다.objective-c 메모리 관리 설명

두 개의 데이터 멤버가있는 개체가 있으며 지금은 구현이 비어 있습니다.

@implementation semester: NSObject{ 
    NSInteger ID; 
    NSString *name; 
} 

다음 내 위임 방법

- (void) receiveSemester:(semester *)newSemester { 
[test setText:newSemester.name]; 
} 

하고있는 형태로 사용되는 도면 :

@interface addSemesterController : UIViewController { 
id<ModalViewDelegate> delegate; 
UITextField *txtName; 
UILabel *prompt; 
UIButton *ok; 
UIButton *cancel; 
} 

모든 객체 속성을 만들어 애플리케이션 파일에 합성된다. 여기에 대리자를 사용하는 방법입니다 :

- (IBAction) okClick:(id)sender{ 
// create semester object and return it 
semester *created = [[semester alloc] init]; 
created.name = txtName.text; 
[delegate receiveSemester:created]; 

    [self dismissModalViewControllerAnimated:YES]; 
} 

그리고 내 할당 해제의 방법은 다음과 같습니다 : 양식에 포함 된 개체의 deallocs으로

- (void)dealloc { 
/* 
[txtName dealloc]; 
[prompt dealloc]; 
[ok dealloc]; 
[cancel dealloc]; 
*/ 
    [super dealloc]; 
} 

이 주석, 내 애플 확인을 실행합니다.

// in main view controller 
- (void) receiveSemester:(semester *)newSemester { 
[test setText:newSemester.name]; 
    // test is a UILabel 
} 

내가 좀비 방법을 시도하고 라벨이 출시 된 객체를 호출하는 것을 말한다 : 나는 그들을의 주석 그러나, 나는 나의 위임 프로토콜에 EXC_BAD_ACCESS 오류가 발생합니다. "form"컨트롤러에서 학기 객체를 공개하지 않을 것이며, 뷰를 할당 해제하기 전에 델리게이트 함수가 호출 되더라도 마찬가지입니다.

분명히 dealloc 메서드에서 개체를 공개해서는 안되며, 왜 내가해야하는지 분명하지 않습니다.

다시 도움을 요청 해주세요. 여기에 당신이 문제가있는 때문에, 대신 변수에 dealloc를 호출하는 변수를 해제

+0

[txtName 릴리스]; [프롬프트 릴리스]; [확인]; [석방 취소]; dealloc 대신에 ARC 자동 참조 카운트를 가지고 작업 할 수도 있습니다 ..... ARC를 사용하면 dealloc, release를 사용할 필요가 없습니다. 자동으로 메모리를 해제합니다 .... 그리고 새로운 것을 만들 때 시작에서 선택하십시오 프로젝트의 경우 편집을 통해 ARC에서 프로젝트를 변경할 수도 있습니다. – TheTiger

+0

ARC 옵션을 찾을 수 없다면 죄송합니다. 어디입니까? – gamda

+0

새 프로젝트를 만들 때 - 프로젝트 이름을 지정하는 창에서 아래에 하나의 옵션이 있음 - "Automatic Reference Counting 사용"이 확인란을 선택한 후 다음을 누릅니다. – TheTiger

답변

2

사용 release -

- (void)dealloc { 

    [txtName release]; 
    [prompt release]; 
    [ok release]; 
    [cancel release]; 

    [super dealloc]; 
} 
+0

완벽! 출시로 인해 앱이 더 이상 충돌하지 않습니다. 나는 아직도 불분명하다. dealloc과 release의 차이점은 무엇입니까? 그리고 메모리 누출을 피할 수있는 적절한 방법을 모두 공개하고 있습니까? – gamda

+0

코드를 작성하기 전에 [문서를 읽으십시오] (https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmRules.html#//apple_ref/doc/)하십시오. uid/20000994-BAJHFBGH). –

+0

@ gamda- 기본 메모리 관리에 대한 문서를 확인해야합니다. - https://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmRules.html#//apple_ref/doc/ uid/20000994-BAJHFBGH – rishi

0

대신의 dealloc의

[txtName release]; 
[prompt release]; 
[ok release]; 
[cancel release]; 

를 작성하려고하고 이러한 개체가 해제됩니다 제대로