2013-09-29 12 views
-1

我有一些单身人士在objective-c问题。虽然我没有在objective-c中看到过这样的例子,但我决定使用singleton来促进ViewController之间的通信。据我所知,这不是视图控制器之间进行通信的鼓励方式,但我想我会给它一个镜头。单身人士和铸造“自我”Objective-C

所以,我单身,我有:

+(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的抱怨,我设置的实例指针自我。警告是:

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;我的猜测是这与调用者有关。

我不经常做objective-c。有没有其他人遇到过这个?有什么想法,为什么我得到奇怪的行为? (是调试器足够可靠?)

注:正在传递的字符串的指针是一个有效的NSString

+6

'self'不会是'FirstViewController *'在一个类的方法(这是完全错误说什么)。不要抛弃指针错误。 – sapi

+6

不是Xcode的问题。 --------阅读一个基本的Objective-C教程:你会发现在类的方法里,'self'指的是类。 (无论如何,在没有实例的情况下,它可能指的是一个实例吗?) – 2013-09-29 08:28:40

+0

谈论蠢事。我把自己放在一个静态的方法中,呜呼!已经晚了 –

回答

1

你应该在你if (_instance == nil)被初始化_instance。毕竟,如果_instance是零,那么它不存在,你需要通过实际分配内存来使它存在。您的声明_instance = (FirstViewController*)self;不会执行任何操作。其次,这是一个类方法,而不是一个实例方法,因此self没有你期望的含义:它不是任何东西的实例(因此不能引用单例实例)。

+0

你在类方法中声明“self'没有意义”是错误的。在Objective-C中,'self'始终是消息的接收者,所以在类方法中,'self'是接收消息的类。 – jlehr

+0

@jlehr谢谢,我已经编辑了答案。 – johnbakers

0

更改_instance = (FirstViewController*)self;

_instance = [[FirstViewController alloc] init] 
+0

为什么?一个好的答案是更多的答案,但指导如何避免将来的问题 –