나는 기억할 수없는 일종의 메모리 관련 문제에 직면하고있다.아이폰 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 함수에서 해제됩니다. 코코아 메모리 관리 지침에 따라 작동해야합니다.
재미있는 점은 내 코드의 다른 부분은 동일한 배열을 사용하고 아무 문제없이 동일한 개체를 전달한다는 것입니다.
어떤 힌트를 주시겠습니까?
''DataHelper searchObjectsInContext : @ "Sections": nil : @ "Id": YES : managedObjectContext]'를 수행하는 것이 유효한 objective-c 구문이라는 것을 이해합니다. 그러나 못생긴 거룩한 암소. 그 매개 변수는 무엇입니까? –