尝试在Singleton中分配属性时的SIGABR异常

时间:2016-05-04 11:49:57

标签: ios objective-c singleton sigabrt class-extensions

当我为物业" myLocal"分配价值时,我有一个 SIGABRT CMRequestManager Init中的Singleton课程。怎么了?

 @interface CMRequestManager (private)
        @property (nonatomic,strong)  NSString* myLocal;
 @end

 @implementation CMRequestManager
        #pragma mark Singleton Methods
        + (id)Manager {
            static CMRequestManager *sharedMyManager = nil;
            static dispatch_once_t onceToken;
            dispatch_once(&onceToken, ^{
                sharedMyManager = [[self alloc] init];
                sharedMyManager.myLocal = @"test test"; //SIGABRT !!!!
            });
            return sharedMyManager;
        }

        - (id)init {
            if (self = [super init]) {

            }
            return self;
        }
 @end

修改

好的,我找到了一个解决方案:移动财产" myLocal"在类扩展名之外的头文件中:

 @interface CMRequestManager 
 @property (nonatomic,strong)  NSString* myLocal;
 @end

这项工作,但我不明白为什么。所以问题仍然存在:我以前的代码中出了什么问题?

1 个答案:

答案 0 :(得分:1)

@interface CMRequestManager (private)

这是你的问题。你的意思是:

@interface CMRequestManager ()

这些看似非常相似,但它们实际上完全不同。第一个是类别。您只是承诺存在这样的属性,但是不会分配任何支持ivar,也不会合成任何getter和setter。您需要在某个实际提供这些内容的@implementation块。

如果您查看了日志,您可能会看到类似于" CMRequestManager不符合myLocal"的键值。或者" CMRequestManager不响应选择器-myLocal"或类似的东西。始终检查日志输出;答案经常在那里。

第二种形式()是一个扩展名。扩展是类定义的延续。在那里定义的属性将自动接收存储和合成的getter和setter。

这两者之间的差异具有很高的历史性。类别形式自ObjC早期就存在,早在属性被添加到语言之前很久(它最初是一种分离大型复杂对象的接口的方式,后来主要成为一种创建方式"受保护的#34;或者#34;朋友"方法)。扩展表单是最近添加的,并且看起来像我们习惯的类别,同时提供ObjC 2附带的一些额外功能(如属性和合成方法)。

当您移动属性时,这是有效的,因为您将其作为实际界面的一部分,这与将其放入扩展中的操作相同。

有关类别和扩展程序的更多讨论,请参阅Programming with Objective-C