Переключение между вкладками с помощью класса Singleton вызывает SIGABRT
Я пришел из более опытных разработчиков Android, поэтому извиняюсь, если это глупый вопрос, но он просто ломает мне голову, и я не вижу, что не так. У меня есть реализация класса Singleton следующим образом:
Заголовочный файл:
@interface SingletonClass : NSObject
{
}
@property(nonatomic, retain) NSMutableArray *categoryArray;
+ (SingletonClass *)sharedInstance;
- (id) init;
- (void)setCategory: (NSMutableArray *) x;
- (NSMutableArray *)getCategory;
@end
Реализация класса:
#import "SingletonClass.h"
@implementation SingletonClass
@synthesize categoryArray;
static SingletonClass *sharedInstance = nil;
+ (SingletonClass *)sharedInstance {
if (sharedInstance == nil) {
sharedInstance = [[super allocWithZone:NULL] init];
}
return sharedInstance;
}
- (id)init
{
self = [super init];
if (self) {
categoryArray = [[NSMutableArray alloc] init];
}
return self;
}
+ (id)allocWithZone:(NSZone*)zone {
return [self sharedInstance];
}
- (id)copyWithZone:(NSZone *)zone {
return self;
}
- (void)setCategory: (NSMutableArray *)category_array{
categoryArray = category_array;
}
- (NSMutableArray *)getCategory{
return categoryArray;
}
@end
У меня есть 2 вкладки, на каждой из которых я пытаюсь получить доступ к объекту Singleton, который содержит нужные мне массивы:
SingletonClass* myapp = [SingletonClass sharedInstance];
categories = [myapp getCategory];
При переключении вкладок это работает, когда Singleton Object не вызывается, но как только я его использую, я получаю ошибку SIGABRT. (Думаю, что это предупреждение памяти). Не являются ли экземпляры Singleton доступными для всех вкладок?
3 ответа
Да, синглтоны, безусловно, могут быть общими для разных вкладок.
а) Если вы не используете ARC, то подсчет ссылок отключен.
б) Это звучит как смещение подсчета ссылок (может случиться с ARC, MRC или GC). Есть диагностический режим "Включить зомби". По сути, это означает, что объекты фактически не освобождаются и не "зомбируются", когда их счетчик ссылок достигает нуля. Зомбированный объект будет отмечать ошибку всякий раз, когда он обменивается сообщениями. Вы можете использовать это и записать счетчик ссылок для объектов, используя инструмент Зомби в Инструментах.
Можете ли вы показать больше кода из метода, который вызывает Singleton? Также будет полезен еще вывод на консоль.
Я предполагаю, что category_Array является висящим указателем, так как исходный categoryArray уже выпущен.
Установщик сохранения (метод setCategory:) должен сохранить свое новое значение и освободить старое.
Просто хочу сказать спасибо тем, кто пытался мне помочь, проблема, с которой я столкнулся, действительно тривиальна. У меня есть поток приложений, созданный с использованием раскадровки, и у меня был установлен неверный CellIdentifier, поэтому я мог бы выдать ошибку памяти.