Objective-CをiPhoneで4週間学習した後、私の最初の便利なアプリケーションはほぼ完成しました。しかし、現在のビューが変更されたときはいつでも、いくつかのインスタンス変数を保存し、ビューを再オープンしたときにインスタンス変数をリロードする必要があります。Objective-Cを使用してリンクリストをファイルから効率的に保存/ロードする方法はありますか?
私はint型とBOOLのような基本的なC型との支障ローディング変数を持っていませんが、Objective-Cのオブジェクトで作られたリンクリストの難しさを持っています。 startPointer、currPointer、およびendPointer:
リンクリストは、3つのポインタによってアクセスされるメモリで構成されています。 各要素は、の最後のポインタ、の次のポインタ、ネストされたリンクリストへのポインタ(、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];
私の質問は3つあり:
- それがロードされたリンクリスト用のメモリを割り当てるために、このようなinitPointerFromListなどのメソッドを使用する必要ですか?
- 方法lastElementとfirstElementを使用してリストを検索することによって、よりcurrPointer、endPointer、およびstartPointerとの関係を維持するためのより効率的な方法はありますか?
- 私が提示したローディングコードの背後にある技術に何か問題はありますか?それがなければ問題はありません。それで、私はまだBAD_ACCESSメッセージを得る。これらのメッセージがローディングコードに縛られているかどうか、またはアプリケーションの残りの部分でオブジェクトの割り当てを処理したかどうかを知りたいです。
ありがとうございます!
ご協力いただきありがとうございます。私はNSMutableArrayを使用しようとします。 – user80495