문제

UIIMAGEPICKERCONTROLLER의 인스턴스 생성 및 파괴와 관련하여 알려진 메모리 누출 문제와 유사하게 UIViewController 클래스의 인스턴스와 관련하여 비슷한 문제를 발견했습니다. uiimagepickercontroller를 사용하는 권장 방법은 인스턴스를 한 번 생성하고 응용 프로그램의 수명 동안 유지하는 것입니다.

내가 다루고있는 상황에는 UIViewController 클래스의 2 가지 인스턴스가 포함됩니다. 시작시 첫 번째 인스턴스가 생성되고 그보기가 MainWindow.xib의 일부인 다른 "Main"UIViewController 클래스에 추가됩니다. 이 첫 번째 인스턴스에는 탭하면 UIViewController 클래스의 새 인스턴스로 전환되는 "정보"버튼이 있습니다 (아직 생성되지 않은 경우). "메인"UIViewController는 일반적인 플립 애니메이션 으로이 전환을 관리합니다. 기본 설정은 Dave Mark의 "iPhone 개발 : iPhone SDK 탐색"책에서 볼 수 있습니다.

발생하는 문제는 "정보"버튼이 처음으로 탭되면 메모리가 새로운 두 번째 UIViewController 인스턴스에 할당되며 응용 프로그램이 끝날 때까지 해제되지 않는다는 것입니다. 이 정보보기의 요소 수로 인해 인스턴스화되면 약 1MB의 메모리를 사용하고 뷰가 슈퍼 뷰에 추가됩니다. 이 인스턴스를 일관되게 파괴하고 재현하려는 시도는 UIImagePickerController 클래스의 인스턴스와 동일한 작업을 시도하는 경우 존재하는 것과 유사하게 메모리 누출을 초래합니다. 근본 원인이 두 클래스 사이에서 동일하다고 생각합니다.

내 문제의 요점은 사용자가 카메라로 사진을 찍을 수 있도록 메모리를 풀어야하는 것과 관련이 있습니다. 그러나 사용자가 사진을 찍고 처음으로 결과 이미지를 볼 때 첫 번째 UIViewController 인스턴스에 존재하는 "정보"버튼을 탭할 수 있습니다. "메인"UIViewController는 기존 UIViewController의보기를 제거하고 정보 화면 용으로 대체합니다. 정보 화면에는 뷰를 다시 전환 할 수있는 "뒤로"버튼이 있습니다. 그러나 사용자가 정보 화면을 떠나 카메라로 다른 사진을 찍기로 선택하면 정보 화면에 할당 된 메모리가 여전히 메모리에 있습니다.

uiimagepickercontroller 클래스는 거의 15-18MB를 일시적으로 사용하는 반면 내부 참조를 출시하기 전에 2 메가 픽셀 이미지를 처리하며 "ImagePickerController : didFinishPickingImage"대의원이 호출됩니다. 두 번째 UIViewController 인스턴스가 Info 버튼을 통해 생성 된 후 사용자가 다른 사진을 찍기 위해 선택하면 메모리 알림이 낮습니다.

메모리는 내 경우 정보 버튼을 탭하든 또는 반복적으로 사진을 찍지 않든 누출되지 않지만, 귀하가 통제 할 수없는 iPhone (Safari 등)의 배경 프로세스와 관련된 다른 문제로 인해 무료입니다. 카메라와 같은 작업을 수행하는 동안 가능한 한 많은 메모리를 올리십시오.

메모리가 누출되지 않도록 UIViewController 클래스의 인스턴스를 깨끗하게 생성하고 파괴하는 방법에 대한 조언이 있습니까?

도움이 되었습니까?

해결책

펜촉에서 두 번째보기 컨트롤러를로드하고 있습니까? 그렇다면 관련 메모리를 올바르게 공개하는지 확인하고 싶을 것입니다.

다음은 내 프로젝트에서 일반적인 NIB 기반보기 컨트롤러의 모습입니다.

일부 ViewController.h

@interface SomeViewController : UIViewController {
    UILabel *someLabel;
}

@property (nonatomic, retain) IBOutlet UILabel *someLabel;

@end

일부 ViewController.m

@implementation SomeViewController

@synthesize someLabel;

- (void)dealloc {
    // Release our retained IBOutlets
    self.someLabel = nil;
    [super dealloc];
}

@end

다른 팁

메모리 사용량을 줄이는 한 가지 방법은 원하는 크기로 이미지를 크기를 조정하는 것입니다 (물론 320x480 이미지를 원하지 않는 한). 그것은 제 경우에 많은 도움이되었습니다.

두 번째 ViewController가 변화에 대해 이야기하고 있습니까? 그렇지 않다면 싱글 톤으로 만들고 동일한 인스턴스를 사용하는 것이 가장 좋습니다. ViewController에서 사용하는 값을 언제든지 변경할 수 있습니다. 이 기사 싱글 톤 객체를 만드는 방법 (코드 포함)을 설명합니다.

여기에 또 다른 기사 싱글 톤 클래스 사용을 보여줍니다 (유스 케이스와 다르지만 싱글 톤 사용 방법을 명확하게 설명합니다).

UIImagePickerController의 싱글 톤 객체를 만드는 것이 좋습니다.

소유권 체인에주기가 있습니까? 같은 것 :

@interface FirstViewController: UIViewController {
  SecondViewController *secondViewController;
}
@end

@interface SecondViewController: UIViewController {
  FirstViewController *firstViewController;
}
@end

이보기 컨트롤러를 폐기 할 때이주기를 명시 적으로 파괴하지 않으면 누출됩니다.

또한 더 이상 필요하지 않을 때 NIB 파일에서로드 된 모든 최상위 객체를 공개 할 책임이 있다고 생각합니다.

Perhaps you could save the image out before transitioning into the info view. After saving, release the image and then transition into the info view. If the user goes back, load the image from the folder.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top