2009-10-07 4 views
0

나는 기억할 수없는 일종의 메모리 관련 문제에 직면하고있다.아이폰 OS에서 메모리 문제 (짧은 버전)

일부 설정을 나열하는 요약보기와 각 설정을 편집 할 수있는 상세보기가 있습니다.

요약보기에서 차례로 핵심 데이터 리포지토리에서로드 된 설정의 배열 (settingArray)로 채워진 tableview가 있습니다. 제목 및 설명 :

// SettingsViewController.h 
@interface SettingsViewController : UIViewController <UITableViewDelegate, UITableViewDataSource> { 
    NSMutableArray *settingArray; 
} 
@property (nonatomic, retain) NSMutableArray *settingArray; 

// SettingsViewController.m 
- (void)viewWillAppear:(BOOL)animated { 
    [self setSettingArray:[DataHelper searchObjectsInContext:@"Sections" :nil :@"Id" :YES :managedObjectContext]]; 
} 

NSManaged 개체 이러한 일련

커스텀 개의 라벨을 보유하고있는 UITableViewCell 값을 할당하는데 사용된다.

// SettingsViewController.m 
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    […] 
    [cell.titleLabel setText:[[settingArray objectAtIndex:indexPath.row] valueForKey:@"Title"]];  
    [cell.descriptionLabel setText:[[settingArray objectAtIndex:indexPath.row] valueForKey:@"Description"]];  
    […] 
} 

사용자가 행을 클릭하면 값을 편집하여 데이터베이스에 저장할 수있는 상세보기가로드됩니다. 요약 뷰는 코어 데이터 데이터베이스의 어떤 레코드가 선택되어 업데이트되어야 하는지를 알기 위해 NSManagedObject 참조 (settingObject)의 상세 뷰를 전달합니다.

// SettingsViewController.m 
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
    if (settingsDetailViewController == nil) { 
     settingsDetailViewController = [[SettingsDetailViewController alloc] initWithNibName:@"SettingsDetailView" bundle:nil]; 
    } 

    // Pass corresponding settingArray object to detail view in the settingObject variable 
    settingsDetailViewController.settingObject = [settingArray objectAtIndex:indexPath.row]; 
    […] 
} 

세부 정보보기에서 사용자는 일부 값을 수정 한 다음 수정 된 핵심 데이터 개체를 데이터베이스에 저장할 수 있습니다.

// SettingsDetailViewController.m 
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
    // Update current setting in database 
    [self.settingObject setValue:[tableView cellForRowAtIndexPath:indexPath].textLabel.text forKey:@"Description"]; 
} 

문제는 값이 NSManagedObject의 상세보기에서 업데이트되면 요약보기에서있는 tableview 정보를 다시로드 할 때, 나는 레이블 정보를 읽을되는 지점에 정확히 EXC_BAD_ACCESS를 얻을 수 있다는 것입니다 설정 배열.

// SettingsViewController.m 
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    [cell.titleLabel setText:[[settingArray objectAtIndex:indexPath.row] valueForKey:@"Title"]];  

    // HERE IS WHERE THE ERROR OCCURS IN THE SECOND PASS 
    [cell.descriptionLabel setText:[[settingArray objectAtIndex:indexPath.row] valueForKey:@"Description"]];  
    […] 
} 

사용중인 settingArray 또는 settingObject의 릴리스와 관련이 있다고 생각하지만 다른 방법과 아직 해결 방법을 시도하지 않았습니다. 모든 변수는 상응하는 .h에서 선언되고 속성은 무독성을 사용하여 추가되고 retain되며 접근자는 .m에서 합성되고 객체는 dealloc 함수에서 해제됩니다. 코코아 메모리 관리 지침에 따라 작동해야합니다.

재미있는 점은 내 코드의 다른 부분은 동일한 배열을 사용하고 아무 문제없이 동일한 개체를 전달한다는 것입니다.

어떤 힌트를 주시겠습니까?

+0

''DataHelper searchObjectsInContext : @ "Sections": nil : @ "Id": YES : managedObjectContext]'를 수행하는 것이 유효한 objective-c 구문이라는 것을 이해합니다. 그러나 못생긴 거룩한 암소. 그 매개 변수는 무엇입니까? –

답변

0

전체 소스가 없으면 문제를 찾아내는 것이 어렵습니다. 당신이 시도 할 수 일부 항목 :

  • 는 "유지"로 SettingsDetailViewController.h에서 "settingObject"속성이 선언되어 있는지 확인합니다. 어쩌면 당신은 "보유"를 잊었지만 dealloc 메서드에서이 인스턴스를 공개 했습니까?
  • SettingsDetailViewController에서 settingObject 속성을 설정하지 말고 (어떤 메소드에서도 사용하지 말고 해당 섹션을 주석으로 처리하십시오). 그 차이가 나는 경우이 SettingsObject의 SettingsDetailViewController의 유지/해제와 관련이 있어야합니다.
  • SettingsDetailViewController (디버거 또는 NSLog 문)에서 settingObject 객체의 "retainCount"를 추적합니다 (사용 자 및 dealloc에서 해제 한 후). . 그러면 단서가 생깁니다.
+0

settingObject는 다음과 같이 설정됩니다. NSManagedObject * settingObject; @property (비 원자력, 보유) NSManagedObject * settingObject; SettingObject의 설정을 주석 처리하면 문제가 사라지고 문제가됩니다. retainCount를 추적하면 초기 값은 5로 설정되어 있습니다. 다른 TabBar 버튼을 클릭하고 설정 탭으로 돌아 가면 오류가 사라져서 요약보기로 돌아갈 수 있다는 것을 의미합니다. [cell.descriptionLabel setText ..] 오류가 발생하지 않습니다. 그러나 다시 설정을 클릭하고 상세보기를로드하면 오류가 다시 발생합니다. – Marianisho

+0

문제를 재현 할 수있는 xcode 프로젝트의 버젼 다운 된 버전을 만들 수 있습니까? 당신이 어떻게 든 그것을 다운로드 할 수 있도록 만들면 나 (또는 ​​동료 SO 사용자)가 시도 할 수 있다면 좋을 것입니다. – pythonquick

1

Clang 정적 분석에서 많은 참조 횟수 오류가 발생하므로 시도해 볼 수 있습니다.

실행 -> 빌드 및 분석을 사용하여 수동으로 실행하거나 "정적 분석 실행"빌드 설정을 통해 모든 빌드에 대해 활성화 할 수 있습니다.

이 도구는 현재 C 및 Objective-C 만 지원하지만 C++/Objective-C++는 지원하지 않습니다.