3

皆さん、私は非常に単純な iPhone アプリケーションを作成しています。データは plist ファイル (基本的には NSDictionary) から取得されます。これをシングルトン クラスにロードし、さまざまなビュー コントローラーで使用してデータにアクセスしようとしています。

これが私のシングルトンの実装です(このスレッドを大幅にモデル化しています)

@implementation SearchData

@synthesize searchDict;
@synthesize searchArray;

- (id)init {
    if (self = [super init]) {
        NSString *path = [[NSBundle mainBundle] bundlePath];
        NSString *finalPath = [path stringByAppendingPathComponent:@"searches.plist"];
        searchDict = [NSDictionary dictionaryWithContentsOfFile:finalPath];
        searchArray = [searchDict allKeys];
    }

    return self;
}

- (void)dealloc {
    [searchDict release];
    [searchArray release];
    [super dealloc];
}

static SearchData *sharedSingleton = NULL;

+ (SearchData *)sharedSearchData {
    @synchronized(self) {
        if (sharedSingleton == NULL)
            sharedSingleton = [[self alloc] init];
    }   
    return(sharedSingleton);
}

@end

したがって、アプリケーションの他の場所 (TableView デリゲートなど) で searchDict または searchArray プロパティにアクセスしようとすると、次のようになります。

[[[SearchData sharedSearchData] searchArray] objectAtIndex:indexPath.row]

*** -[NSCFSet objectAtIndex:]: unrecognized selector sent to instance 0x5551f0 という例外が発生します

objectAtIndex メッセージが NSCFSet オブジェクトに送信される理由がよくわかりません。シングルトンが間違って実装されているように感じます。前述のスレッドでアップルが推奨するような、より複雑なシングルトン実装も試しましたが、同じ問題がありました。あなたが提供できる洞察に感謝します。

4

3 に答える 3

11

メソッドでは、-initインスタンス変数に直接アクセスしており、それらを保持していません。それらは割り当て解除されており、そのメモリはアプリケーションの存続期間中に他のオブジェクトによって使い果たされています。

そこで作成しているオブジェクトを保持するか、不便な方法を使用してオブジェクトを生成してください。

searchDict = [[NSDictionary alloc] initWithContentsOfFile:finalPath];
searchArray = [[searchDict allKeys] retain];
于 2008-12-10T08:59:14.233 に答える
1

合成された変数を割り当てるときはいつでも、「self」を介してそれを行います。

- (id)init {
  if (self = [super init]) {
      NSString *path = [[NSBundle mainBundle] bundlePath];
      NSString *finalPath = [path stringByAppendingPathComponent:@"searches.plist"];
      self.searchDict = [NSDictionary dictionaryWithContentsOfFile:finalPath];
      self.searchArray = [searchDict allKeys];
  }

  return self;

}

また、これらの変数がヘッダー ファイルに「保持」されるように設定したことを確認してください。

于 2008-12-10T14:02:21.297 に答える
0

こんにちは、「自己」を介して合成変数を代入する場合の利点を教えてください。ありがとうシヴァ

値はセッターを介して設定されます。以前の値を解放し、割り当てた値を保持します。

于 2009-08-03T08:49:25.213 に答える