我在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
答案 0 :(得分:1)
您应该在_instance
中初始化if (_instance == nil)
。毕竟,如果_instance
为零,则它不存在,您需要通过实际分配内存使其存在。您的陈述_instance = (FirstViewController*)self;
没有做到这一点。
其次,这是一个类方法,而不是实例方法,因此self
没有您可能期望的含义:它不是任何实例(因此不能引用单例实例)。
答案 1 :(得分:0)
将_instance = (FirstViewController*)self;
更改为
_instance = [[FirstViewController alloc] init]