В моем коде есть странное поведение, и я действительно не знаю, как его решить.
У меня есть класс 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, но ни один из них не был полезен.
Вы не переопределили 'keep',' release' и 'autorelease' - вы выпускаете свой синглтон где-то в своем приложении (это только действительный комментарий, если вы не используете ARC :) – deanWombourne
PS Если вы _are_ используя ARC, эта ссылка http://lukeredpath.co.uk/blog/a-note-on-objective-c-singletons.html даст вам гораздо лучший способ сделать это :) – deanWombourne
Я использую ARC, чтобы там не нужно переопределять 'keep',' release' и 'autorelease'. Также я протестировал метод, описанный в ссылке. Никакого изменения результата. – Emad