当前位置:  开发笔记 > IOS > 正文

Singleton在Objective-C中共享数据源

如何解决《Singleton在Objective-C中共享数据源》经验,为你挑选了1个好方法。

嘿伙计们 - 我正在写一个非常简单的iPhone应用程序.数据来自plist文件(基本上是NSDictionary),我正在尝试加载到单例类中,并使用我的各种视图控制器来访问数据.

这是我的单例的实现(在此线程之后重新建模)

@implementation SearchData

@synthesize searchDict;
@synthesize searchArray;

- (id)init {
    if (self = [super init]) {
        NSString *path = [[NSBundle mainBundle] bundlePath];
        NSString *finalPath = [path stringByAppendingPathComponent:@"searches.plist"];
        searchDict = [NSDictionary dictionaryWithContentsOfFile:finalPath];
        searchArray = [searchDict allKeys];
    }

    return self;
}

- (void)dealloc {
    [searchDict release];
    [searchArray release];
    [super dealloc];
}

static SearchData *sharedSingleton = NULL;

+ (SearchData *)sharedSearchData {
    @synchronized(self) {
        if (sharedSingleton == NULL)
            sharedSingleton = [[self alloc] init];
    }   
    return(sharedSingleton);
}

@end

所以每当我尝试访问我的应用程序中的其他地方的searchDict或searchArray属性时(如TableView委托),如下所示:

[[[SearchData sharedSearchData] searchArray] objectAtIndex:indexPath.row]

我得到一个异常说明*** - [NSCFSet objectAtIndex:]:无法识别的选择器发送到实例0x5551f0

我不太确定为什么objectAtIndex消息被发送到NSCFSet对象,我觉得我的单例实现错误或者什么.我也尝试了一个更复杂的单例实现,就像上面提到的线程中苹果推荐的那样,并且遇到了同样的问题.感谢您提供的任何见解.



1> Ashley Clark..:

在您的-init方法中,您直接访问实例变量,而不是保留它们.它们正在被解除分配,并且它们的内存在应用程序的生命周期中被其他对象用完.

保留您在那里创建的对象,或使用非便利方法生成它们.

searchDict = [[NSDictionary alloc] initWithContentsOfFile:finalPath];
searchArray = [[searchDict allKeys] retain];

推荐阅读
小色米虫_524
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有