Переключение между вкладками с помощью класса Singleton вызывает SIGABRT - PullRequest
0 голосов
/ 23 декабря 2011

Я пришел из более опытных разработчиков 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 ]

0 голосов
/ 23 декабря 2011

Да, синглтоны, безусловно, могут быть общими для всех вкладок.

a) Если вы не используете ARC, то подсчет ссылок отключен.

b) Это похоже на подсчет ссылоксмещение (может происходить с ARC, MRC или GC).Есть диагностический режим «Включить зомби».По сути, это означает, что объекты фактически не освобождаются и не «зомбируются», когда их счетчик ссылок достигает нуля.Затем зомбированный объект будет сообщать об ошибке всякий раз, когда он обменивается сообщениями.Вы можете использовать это и записать счетчик ссылок для объектов, используя инструмент Зомби в Инструментах.

0 голосов
/ 23 декабря 2011

Просто хочу сказать спасибо тем, кто пытался мне помочь, проблема, с которой я столкнулся, действительно тривиальна.У меня есть поток приложений, созданный с использованием раскадровки, и для него был задан неправильный CellIdentifier, поэтому выдается ошибка памяти.

0 голосов
/ 23 декабря 2011

Можете ли вы показать больше кода из метода, который вызывает Singleton?Также был бы полезен еще один вывод на консоль.

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

Сохраняющий установщик (метод setCategory:)должен сохранить его новое значение и освободить старое.

...