내 데이터는 뷰 컨트롤러의 멤버 변수 (NSArray)에 저장됩니다. 내가 겪고있는 문제는 응용 프로그램 실행시 데이터가 데이터베이스에서로드되지만 나중에 NSArray가 초기화되지 않으므로 자동으로 addObject 호출이 실패합니다.응용 프로그램 시작시 참조되는 뷰 컨트롤러 초기화
내보기 컨트롤러 (SafeTableViewController)의 init, initWithNibName, viewWillAppear 및 viewDidLoad 메서드에 중단 점을 넣으려고 시도했지만 그 중 아무 것도 addObject 호출 전에 catch하지 않습니다. 디버거에서 볼 때 0이 아닌 주소를 가지기 때문에 addObject가 호출 될 때 NSArray의 주소가 0x0이므로 실제 뷰 컨트롤러가 초기화되었다고 가정합니다. SafeTableViewController.m에서
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
databaseName = @"DubbleDatabase.sql";
NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDir = [documentPaths objectAtIndex:0];
databasePath = [documentsDir stringByAppendingPathComponent:databaseName];
[self checkAndCreateDatabase];
[self readSafeItemsFromDatabase ];
// Add the tab bar controller's current view as a subview of the window
[window addSubview:tabBarController.view];
[window makeKeyAndVisible];
return YES;
}
- (void) readSafeItemsFromDatabase {
// some code skipped here, but basically: open sqlite3 database, iterate through rows
while(sqlite3_step(compiledStatement) == SQLITE_ROW) {
// read database, get data fields out
SafeItem *safeItem = [[SafeItem alloc] initWithName:aName price:aPrice category:aCategory];
[safeTableViewController addItemToSafe: safeItem]; // PROBLEM HERE
[safeItem release];
}
}
sqlite3_close(database);
}
:
- (void) addItemToSafe : (SafeItem*) newSafeItem {
[self.safeItems addObject: newSafeItem];
}
// I put a breakpoint on this, but it does not hit. i.e. safeItems is not initialized when addObject is called on it.
-(id) init {
if(self = [super initWithNibName:@"SafeTableViewController" bundle:nil]){
self.safeItems = [[NSMutableArray alloc] init];
}
return self;
}
편집 :이 문제를 해결하는 방법의 생각. 여전히 궁금한 점이 있습니다 : init 및/또는 initWithNibName은 언제 호출됩니까? 다음은 제안 된 솔루션입니다.
- (void) addItemToSafe : (SafeItem*) newSafeItem {
if(self.safeItems == nil){
self.safeItems = [[NSMutableArray alloc] init];
}
[self.safeItems addObject: newSafeItem];
}
나는 이것이 옳다고 생각합니다. 다른 답변에서 제안 된대로 분리 된 관리자로 데이터를 이동 시키지만, 사용하고 있기 때문에 되돌아 보았습니다. nib 파일은'init' 대신'initWithNibName'을 호출해야합니다. 고마워요. – unsorted