单身人士和铸造“自我”目标-C

时间:2013-09-29 08:25:07

标签: objective-c singleton

我在objective-c中遇到单身人士的一些问题。虽然我没有在objective-c中看到这样的例子,但我决定使用单例来促进ViewControllers之间的通信。根据我的理解,这不是视图控制器之间鼓励的通信方式,但我想我会试一试。

所以,对于我的单身人士我有:

+(FirstViewController*) getInstance;

在头文件中定义。这将允许外部呼叫者到达它。实施如下:

 static FirstViewController* _instance;
 +(FirstViewController*) getInstance
 {
      //I assume there will be only one copy of this throughout the project, so        
      //pointer confusion is not an issue here, hens it being a singleton
      if (_instance == nil)
      {
           _instance = (FirstViewController*)self;
      }

      return _instance;
 }

这可能会导致麻烦的第一个暗示是XCode抱怨我正在将实例指针设置为self。警告是:

 Incompatible pointer types assigning to "FirstViewController*" from 'class'

好的,警告提到,看起来我正试图将一个指针应用到另一个指针。将此转换为FirstViewController会使警告消失(因为它现在是正确的指针类型),但记住这可能是未来可能出现问题的根源并没有什么坏处。

在FirstViewController中我有一个函数

-(void)assignWord:(NSString *)w

我应该能够通过单例实例来实现这个目标。在我的第二个视图控制器中,我通过以下方式调用它:

FirstViewController* controller = [FirstViewController getInstance];
[controller assignWord:string];
然而,这最终导致崩溃。更具体一点:

+[FirstViewController assignWord:]: unrecognized selector sent to class

有一点非常奇怪的是,它试图将其称为静态函数,而不是在实例中。

我在调试过程中逐步注意到的另一件事是,当我将断点设置为单例的返回时,_instance变量仍为零

 self   Class   FirstViewController 0x0000000100006b98
_instance   SecondViewController *  nil 0x0000000000000000

有点奇怪的是,_instance被视为SecondViewController;我的猜测是它与调用者有关。

我不经常做客观c。还有其他人遇到过这个吗?知道为什么我会变得奇怪吗? (调试器是否足够可靠?)

注意:传递的字符串指针是有效的NSString

2 个答案:

答案 0 :(得分:1)

您应该在_instance中初始化if (_instance == nil)。毕竟,如果_instance为零,则它不存在,您需要通过实际分配内存使其存在。您的陈述_instance = (FirstViewController*)self;没有做到这一点。

其次,这是一个类方法,而不是实例方法,因此self没有您可能期望的含义:它不是任何实例(因此不能引用单例实例)。

答案 1 :(得分:0)

_instance = (FirstViewController*)self;更改为

_instance = [[FirstViewController alloc] init]