1

Objective-C では、ARC でシングルトンを作成する方法は? ARC では、release、autorelease、retain、retainCount メソッドを上書きすることは許可されていません。オブジェクトが解放されるのを回避するにはどうすればよいですか? 私はARCなしで、古典的なシングルトンが以下のようになることを知っています:

@interface SingletonObject
+ (SingletonObject*)sharedObject;
@end

SingletonObject *sharedObj;

@implementation SingletonObject
+ (id)allocWithZone:(NSZone *)zone
{
    if (sharedObj == nil) {
        //So the code [[SingletonObject alloc] init] is equal with [SingletonObject sharedObject]
        sharedObj = [super allocWithZone:zone];
    }
    return sharedObj; 
}


+ (void)initialize
{
    if (self == [SingletonObject class]) {
        sharedObj = [[SingletonObject alloc] init];
    }
}

+ (SingletonObject*)sharedObject
{
    return sharedObj;
}
- (id)retain
{
    return self;
}

- (unsigned)retainCount
{
    return UINT_MAX;  //denotes an object that cannot be released
}

- (oneway void)release
{
    //do nothing
}

- (id)autorelease
{
    return self;
}

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

@end

保持、保持カウント、解放、自動解放メソッドを削除するだけで安全ですか? ありがとう!

4

2 に答える 2

8

シングルトン パターンをサポートするクラスを実装するために必要なメソッドは 1 つだけです。

+ (instancetype)sharedInstance
{
    static id _sharedInstance = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        _sharedInstance = [[self alloc] init];
    });
    return _sharedInstance;
}

それをコピーして任意のクラスに貼り付けると、共有インスタンスが作成されます。それを超えるコードは、実際には必要のない複雑さを追加するだけです。私は時々追加します:

- (void)dealloc
{
     *(char*)0x42 = 'b';
     // no super, ARC all the way
}

バグが原因で共有インスタンスの割り当てが解除された場合、非常に具体的なクラッシュが発生します。(はい、16 進数の 0x42 は 42 ではありませんが、クラッシュ ログのレジスタにナイスな 0x000000042 が残るため、何が起こったかをすぐに特定できます。)

于 2012-12-07T16:14:53.477 に答える
0

はい。

-sharedObject+sharedObjectただし、(クラスメソッド)である必要があります。常にそれを使用していることを確認してください。

于 2012-12-07T03:41:04.510 に答える