2012-07-03 2 views
0

사진을 찍을 수있는 뷰가있는 앱을 개발 중입니다.iPhone : 강한 물건을 파괴하는 메모리 경고?

저는 최근에 아주 이상한 행동에 직면했습니다. 여기에 제 코드가 있습니다.

@interface ViewControllerPhotos : UIViewController 
@property (strong) NSString* _albumID; 
@end 

@implementation ViewControllerPhotos 
@synthesize _albumID; 

- (void)didReceiveMemoryWarning 
{ 
    return; 
    // commented or not : give the same issue 
    // [super didReceiveMemoryWarning]; 
    // Release any cached data, images, etc that aren't in use. 
} 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    [self.navigationItem setHidesBackButton:YES]; 

    self._albumID = [Tools generateUUID]; 

    NSLog(@"new photoset : local UUID \"%@\"", self._photoSetLocalID); 
} 

@end 

내 문제는 : 메모리 경고가있는 경우, _albumID에 저장된 UID 그래서 내 앨범이 두 고장 잊고 다시 생성됩니다. 왜 ? strong 키워드가 현재 값을 유지할 수 있어야합니까?

viewDidload가 다시 호출 되었기 때문입니까? 만약 그렇다면 우리는 적절한 초기화를 위해 처음으로 뷰를로드하는 방법을 알고 있습니까? 그 방법은 그것을 위해 고안된 것 같았다.

+0

개체는 기본적으로 강하므로 여기서는 strong 키워드를 사용하지 않습니다. 앨범에 대한 앨범 ID를 파일에 쓰고 메모리 경고를 받으면 검색하십시오. – Dustin

+0

'if (! self._albumID || [self._albumID isEqualToString : @ ""]) self._albumID = [Tools generateUUID];'viewDidLoad'에서 해결했습니다! – dvkch

답변

2

글쎄, 당신은

viewDidLoad이 때보기로드라고 ... 디버거와 매뉴얼이 알아낼,하지만 수 있습니다. 뷰 컨트롤러가 보이지 않을 때 메모리가 부족한 상황에서 뷰가 언로드 될 수 있습니다. iOS3 +에는 viewDidUnload 메소드가 있습니다. 그런 다음 뒤로 버튼을 누르면보기가 다시 표시됩니다. 의심되는대로 viewDidLoad이 다시 호출됩니다.

이 방법은 UUID를 다시 저장할 때 다시로드 할 때 이 생성되지 않으므로이 생성됩니다.

또는 init 방법으로 할당 할 수 있습니다. 그런 식으로 한번만 부르면됩니다.

+0

참으로'viewDiLoad'가 다시 호출되지만'init'입니다. 이것은 모든 뷰가'init' 메쏘드로부터 자신을 초기화해야한다는 것을 의미하지만,이 경우'frame'과 같은 그래픽 매개 변수를 사용할 수 없습니다. 이것은 메모리 경고를 처리하는 이상한 방법이지만, 아마도 최고이지만, 문서가 부족한 것 같습니다. – dvkch