2012-10-03 3 views
0

부모로부터 하위보기 컨트롤러 (DateViewController)의 속성을 설정하고 두 번째로 잘못된 액세스 오류가 발생하려고합니다. 여기에 코드가 있습니다. 이것은 DateViewController.h입니다. 문제는되어 selectedDate 속성있다 : IOS ViewController 속성에 잘못된 액세스 오류가 설정되었습니다.

내부 DateViewController.m, 내가되어 selectedDate을 합성 않습니다. 이제 상위보기 컨트롤러 (ComdataIOSViewController.m)에서 DateDeviceController의 selectedDate 속성을 ComDataIOSViewController.h의 @interface 섹션에 NSDate *로 선언 된 변수 receiptDate로 설정합니다. 나는 날짜 선택기 컨트롤에서 날짜를 선택,

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    receiptDate = [NSDate date]; 
} 

-(IBAction)btnSetDate { 
    dlgDate=[[DateViewController alloc] initWithNibName:nil bundle:nil]; 
    dlgDate.selectedDate = receiptDate; 
    dlgDate.myDelegate = self; 
    [self presentModalViewController:dlgDate animated:true]; 
    [dlgDate release]; 
} 

-(void) dateViewControllerDismissed:(NSDate *)selectedDate 
{ 
    NSDateFormatter *dateFormat = [[[NSDateFormatter alloc] init] autorelease]; 
    [dateFormat setDateStyle:NSDateFormatterShortStyle]; 
    receiptDate = selectedDate; 
    dateString = [dateFormat stringFromDate:receiptDate]; 
    lblDate.text = dateString; 
} 

그래서 부모 컨트롤러에 설정된 날짜 버튼을 클릭 처음의 DateViewController가 나타나고 컨트롤러는 기각 :이 ComdataIOSViewController.m의 조각입니다. 부모보기 컨트롤러에서 dateViewControllerDismissed가 호출되면서 receiptDate를 selectedDate 매개 변수로 설정합니다. 다음 번에 날짜 버튼을 클릭하면 DateViewController의 selectedDate 속성을 receiptDate로 설정하는 잘못된 액세스 오류가 발생합니다. 나는 이것이 내가 올바르게 다루지 않는 일종의 기억 문제라고 가정하고있다. IOS 프로그래밍은 여전히 ​​나에게 새롭다.

답변

0

코드에서 응용 프로그램을 충돌시킬 수있는 몇 가지 문제점을 발견했습니다. 사실 그들은 메모리 관리 문제입니다.

  1. receiptDate에 객체를 오토 릴리즈 할당 :이 값을 사용하려고 할 때

    receiptDate = [NSDate date]; 
    

    나중에는 receiptDate 포인트가 이미 출시 될 수있는 메모리 때문에 응용 프로그램 충돌이 발생합니다.

    receiptDate = [[NSDate date] retain]; 
    

    dealloc에 공개 또는 어디에서든지 당신이 그것을 변화 (나는 그것을 선언하는 방법을 잘 모릅니다 그것은 retain 재산해야합니다.) : 당신은 값을 유지하여 해결할 수 있습니다.

  2. 당신은 그것을 유지하지 않고 NSDate을 할당하는

    는 :

    receiptDate = selectedDate; 
    

    당신은 유지하여 고칠 수 :

    receiptDate = [selectedDate retain]; 
    

내가 메모리 관리의 모든 측면을 쓸 수 있기 때문에 미안 해요 객관적으로 - C에서. iOS 메모리 관리자를 잘 모르는 경우 ARC를 사용하는 것이 좋습니다.

당신은 애플이이 가이드에 유용한 정보를 많이 찾을 수 : Advanced Memory Management Programming GuideMemory Management Programming Guide for Core Foundation

0

귀하의 속성은 유지되지 않습니다. 귀하의 속성 선언에서 assignretain으로 변경하는 것이 좋습니다. 그러면 문제가 해결되며 선택한 날짜를 설정 한 모든 곳에서 retain 번으로 전화하지 않아도됩니다. 그 재산은 당신을 위해 그것을 할 것입니다.당신은 ARC를 사용하지 않는 경우

,과 같이, 당신의 dealloc 메서드에서 전무로 속성을 설정하는 것을 잊지 마세요 : 나는 self.selectedDate를 사용

self.selectedDate = nil; 

참고. selectedDate가 변수가 아닌 속성으로 액세스되도록하는 것이 중요합니다.

+0

나는 이전에 속성을 유지하도록 설정 했음에도 불구하고 아무런 차이가 없다고 언급 했어야합니다 (올바른 것이지만 유지하도록 설정해야 함). 아래 답변은 내 문제를 해결했습니다. – Bob

+0

다행스럽게 문제를 해결했습니다. :) –

관련 문제