使用Singleton类在选项卡之间切换会导致SIGABRT

时间:2011-12-23 14:03:01

标签: iphone objective-c 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个Tabs,我尝试访问Singleton对象,它包含我需要使用的数组:

SingletonClass* myapp = [SingletonClass sharedInstance];
categories = [myapp getCategory];

当切换标签时,它在未调用Singleton Object时有效,但是一旦我使用它,我就会收到SIGABRT错误。 (认为​​这是记忆警告)。 Singleton实例是否不能在Tabs中共享?

3 个答案:

答案 0 :(得分:0)

你能从调用Singleton的方法中显示更多代码吗? 另外一些控制台输出会有所帮助。

我的猜测是,category_Array是一个悬空指针,因为原始的categoryArray已经被释放。

保留setter(“setCategory:”方法)应该保留它的新值并释放旧值。

答案 1 :(得分:0)

是的,单身人士当然可以在标签之间共享。

a)如果您没有使用ARC,那么您的引用计数已关闭。

b)这听起来像是参考计数偏移(可能发生在ARC,MRC或GC上)。有一个诊断模式“启用僵尸”。基本上,这意味着当引用计数达到零时,对象实际上不会被释放并“zombified”。然后,只要有消息,zombified对象就会记录错误。您可以使用它并使用仪器中的Zombies仪器记录对象的参考计数。

答案 2 :(得分:0)

只想对那些试图帮助我的人说声谢谢,我遇到的问题真是微不足道。我使用故事板创建了应用程序流,并且设置了错误的CellIdentifier,因此会引发内存错误。