ios-具有相同名称'sharedObj'的两个单例类

时间:2014-11-11 07:58:50

标签: ios objective-c singleton

我添加了两个单例类'A'和'B'。

A具有对象字符串a1;

 A *sharedObject;
    +(A*)getSharedObject{
    if(sharedObject == nil)
    {
    sharedObject = [[A alloc]init];
sharedObject.a1 = @"A obj";
    }
    return sharedObject;
    }

B有对象字符串b1;

    B *sharedObject;
    +(B*)getSharedObject{
    if(sharedObject == nil)
    {
    sharedObject = [[B alloc]init];
sharedObject.b1 = @"B obj";
    }
    return sharedObject;
    }

我用过

A *aObj = [A getSharedObject];
NSLog(@"%@",aObj.a1);
B *bObj = [B getSharedObject];
NSLog(@"%@",bObj.b1);

崩溃说bObj是'A'类型并且没有对象b1。 然后我给出了不同的名字sharedObectAsharedObjectB

我需要知道为什么会这样。两个对象具有相同的名称但是是类级别的。

感谢。

2 个答案:

答案 0 :(得分:0)

您的共享实例变量必须在实现文件中声明为static。

static A* sharedObject;
@implementation
+(A*)getSharedObject
{
  if(!sharedObject)
  {
    sharedObject=[[A alloc] init];
  }
  return sharedObject;
} 
//...
@end

要更安全地创建共享实例,请使用dispatch_once片段。

答案 1 :(得分:0)

如果您已在一个简单的实现文件(.m)中添加了所有这些代码,则不会声明A类方法或B类方法。你在实现语句中声明了类的方法:在你的类中看看:@implementation ThisIsYourClass。 ThisIsYourClass是clas方法,两者都是相同的。 在Objective C中,方法是选择器(内部和外部),在你的情况下两者都是相同的选择器, @selector(getSharedObject)。事实上,你应该用重复的方法发出重大警告。 在运行时调用此选择器时,始终是第一个。