Well, after a couple of hours of tracing RSSChannel with the debugger, I found the problem:
When we are parsing the JSON data from Apple, we don’t tell the RSSChannel to read anything for the infoString. So I added this line within -readFromJSONDictionary: in RSSChannel
[self setInfoString:[[feed objectForKey:@"rights"] objectForKey:@"label"]];
And for the RSS feed from this forum’s servers, in -fetchRSSWithCompletion:, we make a copy of the cachedChannel. The first time this application is run, the cachedChannel is empty, which makes the copy empty as well. Then in the completion block we add the new items returned from the server via the completion block (RSSChannel *obj) with the copy, which is still empty. Since it is empty, it has no knowledge of any title or infoString. “obj” does, but it does not pass this information along to the copy – only a sorted version of its items array. When we actually get to archiving this copy, it still knows nothing of a title or infoString.
Then the next time the app is run, or we switch screens and the data gets downloaded again, our code unarchives this very same cached version of RSSChannel, which, again, knows nothing of a title or infoString.
The solution is simple: just add these two lines to -addItemsFromChannel:
[self setTitle:[otherChannel title]];
[self setInfoString:[otherChannel infoString]];
Perhaps this was simply overlooked when writing the code for the book?
I’ve really enjoyed this book, by the way. After about 6 months of reading it due to other obligations and not having a lot of time to read it, I have learned so much and am almost ready to start with my own applications (just one more chapter).