|
Hi,
The test "if ( nil == records )" within the awakeFromNib method do not work. You use
records = [[NSMutableArray alloc] initWithArray:[prefs arrayForKey:@"Addresses"]];
To read the data from the preferences system into the data structure. Once the alloc is performed the pointer "records" no longer points to nil, regardless of what happened in the init code. You can test this by pointing a break point in the code, or like I did on accident. Run the program in the final form, add some stuff, and quit. Then delete the com.###.AddressBook.plist, but keep the AdressBookData.plist. Re-run the program and nothing shows up. The if statement returns NO, because your pointer has a value after alloc.
Here is what I used to solve the problem:
records = [[NSMutableArray alloc] initWithArray:[prefs arrayForKey:@"Addresses"]];
if ( nil == [records count]) {
records = [[NSMutableArray alloc] initWithContentsOfFile:recordsFile];
if ( nil == [records count] ) {
records = [[NSMutableArray alloc] init];
} else {
[self saveData];
}
}
}
The else { [self saveData] } serves to re create the preferences file from the AddressBookData.plist file if it is missing.
Great articles, I am learning a lot.
Jeremy
|
Now, in your fix wouldn't we want to do
if ( [records count] == 0 ) instead of
if ( [records count] == nil )? I'm trying to think if there's a more fundamental to test whether or not the initialization was successful, but can't think of anything at the moment.
The last [self saveData] isn't strictly necessary, as the preferences file would be re-written the first time a record is added. I was actually debating whether or not to do just this when i was writing this code, and I decided to keep things less cluttered, pedagogically speaking. But on the other hand, it's not a bad idea either.
Thinking about it a little more, we could have two different types of if statements, rather than the way we've been doing it. For example, we could do the following:
if ( nil != [prefs arrayForKey:@"Addresses"] ) {
records = [[NSMutableArray alloc] initWithArray:[prefs arrayForKey:@"Addresses"] )
} else if ( [[NSFileManager defaultFileManager] fileExistsAtPath:recordsFile] == YES ) {
records = [[NSMutableArray alloc] initWithContentsOfFile:recordsFile];
} else {
records = [[NSMutableArray alloc] init];
}
(I hope this code posts right, tough in this small editing window :)