在为 iPhone 学习了 4 周的 Objective-C 之后,我的第一个有用的应用程序几乎完成了。但是,每当当前视图更改时,我仍然需要保存几个实例变量,并在重新打开视图时重新加载它们。
我可以毫无困难地加载具有基本 C 类型(如int和BOOL )的变量,但在使用由 Objective-C 对象组成的链表时遇到了困难。
链表由三个指针访问的内存组成:startPointer、currPointer和endPointer。每个元素由一个last指针、一个next指针、一个指向嵌套链表 ( nestedPtr ) 的指针和一些变量组成。
我的第一次尝试是在加载代码中执行以下操作:
//dataStorageObj will contain the values to be loaded
dataStorageObj = [[DataSaver alloc] init];
NSData *data =[[NSMutableData alloc] initWithContentsOfFile:[documentsDirectory stringByAppendingPathComponent:@"Archive"]];
NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];
dataStorageObj = [unarchiver decodeObjectForKey:@"KeyForViewA"];
[unarchiver finishDecoding];
//****************************
//Simple variables loaded here
//****************************
//DataSaver is a class with methods to retrieve its instance variables
//The methods are named after the values they retrieve
startPointer = [dataStorageObj startPointer];
currPointer = [dataStorageObj currPointer];
endPointer = [dataStorageObj endPointer];
[unarchiver release];
[data release];
我在最后放置了一个调试点,所有变量都有正确的值。实际上访问代码中的值(在控制台中这样做)会导致EXC_BAD_ACCESS消息。
接下来,我将链表加载行更改为以下内容:
startPointer = [[PointerClass alloc] initPointerFromList:[dataStorageObj startPointer]];
currPointer = [[PointerClass alloc] initPointerFromList:[dataStorageObj currPointer]];
endPointer = [[PointerClass alloc] initPointerFromList:[dataStorageObj endPointer]];
initPointerFromList方法:
-(PointerClass *)initPointerFromList:(PointerClass *)theList
{
last = theList.last;
nestedPointer = [[NestedPointerClass alloc] initNestedPointerFromList:theList.nestedPointer];
//****************************************
//Other variables loaded from theList here
//****************************************
if (theList.next != nil)
{
next = [[PointerClass alloc] initPointerFromList:theList.next];
}
return self;
}
现在的问题是指针都指向单独的链表,所以我编写了方法来检索 currPointer 引用的链表的开始和结束位置:
currPointer = [[PointerClass alloc] initPointerFromList:[dataStorageObj currPointer]];
endPointer = [currPointer lastElement];
startPointer = [currPointer firstElement];
我的问题有三个:
- 是否需要使用initPointerFromList等方法为已加载的链表分配内存?
- 有没有比使用lastElement和firstElement方法搜索列表更有效的方法来维护currPointer、endPointer和startPointer之间的关系?
- 我提供的加载代码背后的技术有问题吗?没有它,我没有问题;有了它,我仍然收到BAD_ACCESS消息。我想知道这些消息是否与加载代码有关,或者是否与我在整个应用程序的其余部分中处理对象分配的方式有关。
提前致谢!