【问题标题】:Singletons and Casting "Self" Objective-C [duplicate]单例和铸造“自我”Objective-C [重复]
【发布时间】: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


【解决方案1】:

您应该在您的if (_instance == nil) 中初始化_instance。毕竟,如果_instance 为nil,那么它就不存在,您需要通过实际分配内存来使其存在。你的声明_instance = (FirstViewController*)self; 没有做任何这些。

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

【讨论】:

  • 您在类方法中“self 没有意义”的说法不正确。在 Objective-C 中,self 始终是消息的接收者,所以在类方法中,self 是接收消息的类。
  • @jlehr 谢谢,我已经编辑了答案。
【解决方案2】:

将您的 _instance = (FirstViewController*)self; 更改为

_instance = [[FirstViewController alloc] init]

【讨论】:

  • 为什么?一个好的答案不仅仅是一个答案,而是关于如何在未来避免问题的说明
猜你喜欢
  • 2012-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-12
相关资源
最近更新 更多