0

これは非常に奇妙です。他の多くのシングルトンに使用したのと同じパターンを使用して、アプリで新しいシングルトンを作成しました。ただし、これはデバッガーではうまく機能しません。シングルトンを取得するためのコードは次のとおりです。

- (id)init
{
    self = [super init];
    if (self) {
        [self loadData];
    }
    return self;
}

+ (Settings *)sharedInstance
{
    static Settings *sharedInstance = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        sharedInstance = [[self alloc] init];
        // Do any other initialisation stuff here
    });
    return sharedInstance;
}

デバッガーからオブジェクトにアクセスしようとすると、次のようになります。

error: Execution was interrupted, reason: EXC_BAD_ACCESS (code=1, address=0x20).
The process has been returned to the state before expression evaluation.

明らかに、デバッガーからシングルトンのハンドルを取得しようとしているのではなく、プロパティを取得しようとしていました。これにより、さらに興味深い出力が得られます。

(lldb) po [Settings sharedInstance].jpegCompressionLevel
error: warning: got name from symbols: Settings
warning: receiver type 'void *' is not 'id' or interface pointer, consider casting it to 'id'
error: no known method '-sharedInstance'; cast the message send to the method's return type
error: 1 errors parsing expression

ここで何が起こっているのですか?コード内からの呼び出しはうまくいくようです。ただし、デバッガーは常に失敗します。同じコンテキストで、(同じパターンを使用して) 他のシングルトンに問題なくアクセスできます。

loadData メソッドはディスクからディクショナリをロードするだけであり、クラスのプロパティのゲッターは ivar ではなく、そのディクショナリの値を使用することに注意してください。

loadData のコードは次のとおりです。

-(void)loadData
{
    // Load data from persistent storage
    NSString *path = [self pathToDataFile];
    NSMutableDictionary *settingsDict = [NSMutableDictionary dictionaryWithDictionary:[NSKeyedUnarchiver unarchiveObjectWithFile:path]];
    _settingsDict = settingsDict;
}
4

1 に答える 1