调用singleton类抛出EXC_BAD_ACCESS

时间:2012-06-18 15:43:04

标签: objective-c singleton exc-bad-access

我的代码中有一种奇怪的行为,我真的不知道如何解决它 我有一个具有这个定义的Singleton类:

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]时,一切都很好。但是当我在一行特定代码之后调用singleton类时,它会抛出EXC_BAD_ACCESS(code = 1,address = 0xfffffeec)并引用单例类中return instance定义中的sharedManager

该特定代码正在初始化一个创建HTTP请求并开始发送请求的类,但在类中不是AppModelLocator或特殊内容的任何引用。它是NSURLConnection及其委托方法的简单创建。

我在其他应用程序中使用了类似的类和方法,它们工作正常,我想知道这个类有什么问题。我尝试了其他十几种创建单例类的方法,但没有一种方法有用。

2 个答案:

答案 0 :(得分:0)

为什么不简单地使用GCD来实例化你的单身?

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

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

    return instance;
}

答案 1 :(得分:0)

最后,我发现代码中出了什么问题。我动态创建了一个NSURL实例,并使用第三个库来加密URL。通过编码的东西导致特殊情况下的崩溃,但我想知道为什么在调用单例类之后引发了异常。无论如何,这个问题并不是因为deanWombourne所说的单身定义。