2012-03-01 2 views
0

UIViewController의 하위 클래스 인 OTNetwork 클래스가 있습니다.UIViewController를 호출하고 결코 할당 해제되지 않습니다.

사용자는 내가 전화를이 코드를 사용 버튼을 밀어 때 :

사용자가 종료 싶어
OTNetwork *net = [[OTNetwork alloc] initWithNibName:@"OTNetwork" bundle:nil]; 

[self presentModalViewController:net animated:YES]; 

[net release]; 

, 버튼을 밀어하고 OTNetwork 객체가 호출자의 ViewController 뷰 컨트롤러를 기각한다 알림을 보냅니다. 이것은 코드입니다 :

[self dismissModalViewControllerAnimated:YES]; 

내 문제는 OTNetwork 객체 dealloc 메소드가 호출되지 않는다는 것입니다. 그리고 결코 멈추지 않는 타이머에 대한 무효화 호출이 있습니다. 임시적인 문제는 메모리 누수입니다.

발신자보기 컨트롤러에서이 개체는이 코드 행에 의해서만 생성되거나 해제됩니다.

도움이 필요하십니까?

미리 감사드립니다.

답변

1

자동 해제는 dealloc이 호출 될 때 보장하지 않으며 사용자가 이에 의존해서는 안됩니다.

그리고 자동 루프 풀은 스레드 또는 닫힌 루프에서 많은 메모리 할당이있을 때 사용해야합니다. 이미 별도의 풀에서 실행되는 주 스레드에서는 사용하지 않아야합니다.

OTNetwork 클래스에서 invalidate 타이머 호출을 viewDidUnload 또는 viewWillDisappear로 이동해야합니다.

희망이 있습니다.

[업데이트 : 2012년 3월 2일]

이라고 그 할당 해제를 확인하려는 경우, 다음

1) OTNetwork 컨트롤러

OTNetwork *net = [[OTNetwork alloc] initWithNibName: @"OTNetwork" bundle: nil]; 
net.delegate = self; 
self.modalV = net; // @property (nonatomic, strong) OTNetwork *modalV; 
[net release]; 

[self presentModalViewController: modalV animated: YES]; 

에 대한 참조를 저장하려고 2) OTNetwork의 프로토콜/위임자를 정의하여 닫을 때보고하십시오.

// .h 
@protocol OTNetworkDelegate; 
    - (void) netViewClosed; 
@end 

// .m 
- (void) viewDidUnload 
{ 
    [self.delegate netViewClosed]; 
} 

3) mainViewController에서 프로토콜을 구현하십시오.

- (void) netViewClosed 
{ 
    if(modalV) 
    { 
     [modalV release], modalV = nil; 
    } 
} 
+0

답변을 주셔서 감사합니다,하지만 내가 undestood, 방법을 만듭니다 개체를 가져 와서 그것을 반환해야합니다, autorelease 권리가 있어야합니까?이 경우에는 어떻게 풀릴 것이라고 가정 할 수 있습니까?이 메서드의 호출자에 의해 – NemeSys

+1

개체 할당 및 반환 다른 질문입니다.하지만 네, autorelease 수 있습니다. 함수에서 반환하는 동안 객체를 반환하지만 호출 함수에서 유지해야합니다. 그러나 현재 질문의 맥락에서 dealloc이 호출되도록하려면 "net"객체에 대한 참조를 유지 한 다음 수동으로 해제하십시오 viewcontroller가 닫힐 때를 알기 위해서는 호출 컨트롤러로 다시보고 할 델리게이트를 설정해야 할 수도 있습니다. 내 대답을 날짜를 기입하는 방법을 포함합니다. – vipinagg

1

내가 OTNetwork 객체를 navigationController라고 가정하고 OTNetwork 객체를 전달하면 OTNetwork 객체가 릴리스 풀에 있고 해제 될 때 걱정할 필요가 없습니다. 코드가 메모리에 좋기 때문에 걱정할 필요가 없습니다. 조치.

그래서 짧은 대답, 자사의 오토 릴리즈 풀

+0

예, 이것을 가정합니다. 그러나 문제는 dealloc 함수가 호출되지 않는다는 것입니다. 그리고 메모리 때문에 프로그램이 충돌합니다.: ( – NemeSys

+0

어쩌면 당신은 응용 프로그램을 유지하거나 다른보기에서 그보기 컨트롤러를 할당하고 자동 풀 풀에 의해 풀려나지만 다시 그 클래스에 의해 액세스되는 –

1

에 당신의 dealloc이 시도 할 수 있습니다 자신의 오토 릴리즈 풀을 사용하여 호출 할 수 있습니다.

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
try{ 
//your code for allocating that object 
OTNetwork *net = [[[OTNetwork alloc] initWithNibName:@"OTNetwork" bundle:nil] autorelease]; [self presentModalViewController:net animated:YES]; 
} 
finally{ 
[pool drain]; 
}