【发布时间】:2013-09-29 08:25:06
【问题描述】:
我在 Objective-c 中遇到了一些单例问题。虽然我没有在 Objective-c 中看到过这样的例子,但我决定使用单例来促进 ViewController 之间的通信。据我了解,这不是鼓励在视图控制器之间进行通信的方式,但我想我会试一试。
所以,对于我的单身人士,我有:
+(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;我的猜测是它与调用者有关。
我不经常做objective-c。有没有其他人遇到过这个?知道我为什么会出现奇怪的行为吗? (调试器是否足够可靠?)
注意:被传递的字符串指针是一个有效的 NSString
【问题讨论】:
-
self不会是类方法中的FirstViewController *(这正是错误所说的)。不要抛弃指针错误。 -
不是 Xcode 问题。 -------- 阅读Objective-C 基础教程:你会发现在类方法内部,
self指的是类。 (如果没有实例,它怎么可能引用实例?) -
谈论愚蠢。我把 self 放在一个静态方法中,哇哦!来晚了
-
Obj-C 与其他类似语言(如 Java)的奇怪之处:
self并不总是相同的东西。在+方法中,self是对类的引用,而不是类的实例。这样,您可以调用其他+方法,例如[self otherClassMethod]。
标签: objective-c singleton