2012-06-18 2 views
0

В моем коде есть странное поведение, и я действительно не знаю, как его решить.
У меня есть класс Singleton с этим определением:Вызов singleton class throw EXC_BAD_ACCESS

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 (код = 1, адрес = 0xfffffeec) и ссылается на return instance в sharedManager определении в одноэлементном классе.

Этот конкретный код инициализирует класс, который создает HTTP-запрос и начинает отправлять запрос, но в классе не содержит ссылок на AppModelLocator или что-то особенное. Это простое создание NSURLConnection и его методов делегирования.

Я использовал аналогичные классы и подход в других приложениях, и они отлично работают, и я задаюсь вопросом, что не так с этим классом. Я попробовал еще дюжину других способов создания класса singleton, но ни один из них не был полезен.

+0

Вы не переопределили 'keep',' release' и 'autorelease' - вы выпускаете свой синглтон где-то в своем приложении (это только действительный комментарий, если вы не используете ARC :) – deanWombourne

+0

PS Если вы _are_ используя ARC, эта ссылка http://lukeredpath.co.uk/blog/a-note-on-objective-c-singletons.html даст вам гораздо лучший способ сделать это :) – deanWombourne

+0

Я использую ARC, чтобы там не нужно переопределять 'keep',' release' и 'autorelease'. Также я протестировал метод, описанный в ссылке. Никакого изменения результата. – Emad

ответ

0

И наконец, я нашел код ошибки. Я сделал экземпляр NSURL динамически, и я использовал 3-ей библиотеку для шифрования URL-адреса. Что-то из-за кодирования вызвало крах в особых условиях, но мне интересно, почему возникло исключение после вызова класса singleton. В любом случае проблема была не из-за определения singleton, как сказал deanWombourne.

0

Почему бы вам просто не использовать GCD для создания вашего синглтона?

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

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

    return instance; 
} 
+0

Сначала прочитайте комментарии;) Это не синглтон, вызывающий крушение , – deanWombourne