0

私のコードには奇妙な振る舞いがあり、それを解決する方法が本当にわかりません。
私はこの定義を持つシングルトンクラスを持っています:

AppModelLocator.h>

#import <Foundation/Foundation.h>

@interface AppModelManager : NSObject

+ (AppModelManager *)sharedManager;

@end

AppModelLocator.m

#import "AppModelManager.h"

static AppModelManager *instance = nil;

@implementation AppModelManager

#pragma mark - Singletone
#pragma mark

+ (AppModelManager *)sharedManager
{
    @synchronized ([AppModelManager class]) {
        if (instance == nil) {
            instance = [AppModelManager new];
        }
    }

    return instance;
}

+ (id)alloc
{
    @synchronized ([AppModelManager class]) {
        NSAssert(instance == nil, @"Attempted to allocate the second instance of AppModelManager.");
        instance = [super alloc];
        return instance;
    }

    return nil;
}

@end

[AppModelLocator sharedManager]コードのどこかを呼び出すと、すべて問題ありません。しかし、特定のコード行の後でシングルトンクラスを呼び出すと、EXC_BAD_ACCESS(code = 1、address = 0xfffffeec)がスローされ、シングルトンクラスの定義で参照さreturn instanceれます。sharedManager

AppModelLocatorその特定のコードは、HTTPリクエストを作成してリクエストの送信を開始するクラスを初期化していますが、クラス内には参照や特別なものはありません。NSURLConnectionこれは、とそのデリゲートメソッドの簡単な作成です。

私は他のアプリケーションで同様のクラスとアプローチを使用しましたが、それらは正常に機能しており、このクラスの何が問題になっているのでしょうか。シングルトンクラスを作成する他の12の方法を試しましたが、どれも役に立ちませんでした。

4

2 に答える 2

0

シングルトンをインスタンス化するために単にGCDを使用してみませんか?

+ (AppModelManager *)sharedManager
{
    static AppModelManager* instance;
    static dispatch_once_t onceToken;

    dispatch_once(&onceToken, ^{
        instance = [[AppModelManager alloc] init];
    });

    return instance;
}
于 2012-06-18T18:42:25.047 に答える
0

最後に、コードのどこが間違っているのかを見つけました。インスタンスを動的に作成し、NSURL3番目のライブラリを使用してURLを暗号化しました。エンコーディングを介した何かが特別な条件でクラッシュを引き起こしましたが、シングルトンクラスを呼び出した後に例外が発生したのはなぜだろうか。とにかく、この問題は、deanWombourneが言ったようにシングルトンの定義によるものではありませんでした。

于 2012-06-21T06:06:42.713 に答える