Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 在IBAction中,“在IBAction中”;“自我”;仅引用对象的第一个实例_Objective C_Macos_Cocoa_Self_Ibaction - Fatal编程技术网

Objective c 在IBAction中,“在IBAction中”;“自我”;仅引用对象的第一个实例

Objective c 在IBAction中,“在IBAction中”;“自我”;仅引用对象的第一个实例,objective-c,macos,cocoa,self,ibaction,Objective C,Macos,Cocoa,Self,Ibaction,这是一个基本的Objective-C问题,但我很困惑,我还没有在其他地方找到答案。我有一个自定义类,我们称之为MyObject。在main menu.xib中,我有一个按钮,可以触发该自定义类中的iAction。在同一个NIB文件中,我有一个MyObject类的对象(蓝色立方体),因此我可以将按钮“连接”到自定义类中的方法(作为iAction)。这一切都很好 我需要创建MyObject的多个实例,我在该对象上调用了几个方法,其中一些是简单(void)方法,都在类中,还有一些是链接到main me

这是一个基本的Objective-C问题,但我很困惑,我还没有在其他地方找到答案。我有一个自定义类,我们称之为MyObject。在main menu.xib中,我有一个按钮,可以触发该自定义类中的iAction。在同一个NIB文件中,我有一个MyObject类的对象(蓝色立方体),因此我可以将按钮“连接”到自定义类中的方法(作为iAction)。这一切都很好

我需要创建MyObject的多个实例,我在该对象上调用了几个方法,其中一些是简单(void)方法,都在类中,还有一些是链接到main menu.xib文件中按钮的iActions

当我在非iActions的(void)局部方法中使用“self”时,它总是引用类的当前活动实例,正如我所希望和期望的那样。当我在iActions中使用“self”时,它总是只引用该自定义对象的第一个实例

我可以通过在一个单独的(指向MyObject的指针)变量中跟踪当前活动的实例来轻松解决这个问题,但我想知道为什么“self”在某些方法中能像预期的那样工作,而在iActions中却不能,即使它们都在一个类文件中

下面的代码片段旨在解释我的意思(我希望它能工作!):

如果我将多个对象中的第一个对象设置为活动对象(例如,通过单击其窗口),则得到的结果(使用模拟地址)为:

在iAction中,我自己是:0xaddress01活动对象:0xaddress01

来自普通方法:SELF是:0xaddress01活动对象:0xaddress01

如果我在自定义类的第二个对象的窗口中单击,我会得到:

在iAction中,我的自我是:0xaddress01活动对象:0xaddress02

来自普通方法:SELF是:0xaddress02活动对象:0xaddress02

我不明白为什么在iAction的第二个对象上使用的“self”指向第一个对象。任何帮助理解这一点都将不胜感激

为回应肯·托马斯的回答而添加的评论(谢谢,肯):

谢谢,这个答案很清楚,很有道理。正如我所说的,通过使用单独维护的变量(或数组)来保存MyObject的每个实例,我可以很容易地解决这个问题——无论如何我都需要这样做。所以我的问题变成了理论性的:这是做这件事的“正确”方法吗?我在main menu.xib(应该在哪里)中有几个按钮,它们连接到自定义类中的方法。我只能用“blue cube”对象以这种方式连接它们,该对象表示MainMenu.xib中的自定义类,并且我不能在这些方法中使用“self”。这种“感觉”是错误的,因为我在类的所有其他方法中使用了“self”,并且它按照我的预期工作——在这些方法中,它随每个实例而变化

那么,这是一种正确的方法,还是应该使用其他一些策略,以便能够在自定义类的所有方法中使用“self”,如果是,那么该策略是什么

我看到自定义类的第一个实例是在启动时加载MainMenu.xib时创建的,因为该文件中有一个“蓝色立方体”。我有蓝色立方体,因为没有它,我不知道还有什么其他方法可以将按钮连接到自定义类的方法。有没有一种方法我还没有想到?如果是这样,我希望我可以消除蓝色立方体,从而消除第一个自动创建的自定义对象实例。因此,我可以在自定义类的所有方法中以相同的方式使用self


非常感谢您对这个话题的任何解释。另一方面,我不明白为什么我原来的问题有两张反对票。太笨了?

它并不总是引用同一个实例。之所以如此,是因为应用程序中的控件仍然具有与以前相同的目标。

MainMenu.xib包含应用程序主菜单的存档。NIB在应用程序启动时加载,其中的菜单未归档,并作为运行时的实际主菜单安装

显然,根据您所说的,您还在NIB中实例化了
MyObject
类的一个实例。此实例在NIB中存档。(我在这里挥手告别一些不重要的细节。)加载NIB时,该实例未归档,并成为应用程序进程中的“活动对象”

您在NIB中建立的与该对象的任何连接都会连接到该实例。特别是,您显然已将某些按钮的目标直接连接到该实例。这些连接是固定的。这些按钮的目标是该实例,而不是其他实例

因此,当您按下按钮时,将调用(固定)目标上的操作方法

相比之下,当您在代码中调用方法时,您可以指定接收者,并且可以任意动态。如果代码的逻辑是这样做的,那么可以将这些消息发送到不同的实例


听起来有点像你想让你的按钮指向NIB的第一个响应者。这是对象链的占位符,从具有焦点的任何视图开始,直到其包含窗口,然后是应用程序,因此它会随着焦点的变化而变化。但是,如果没有更多的细节,很难确定这就是您想要的。

self
总是指调用方法的实例,而不是其他任何东西。
@implementation MyObject

MyObject *theActiveObject;

- (instancetype) init {
    self = [super init];
    if (self)
        theActiveObject = self;
    return self;
    }

- (IBAction)showSelf:(id)sender {
    NSLog(@"from an IBAction, my SELF is: %p theActiveObject: %p", self, theActiveObject);
    [self showSelfOther];
    }

- (void) showSelfOther {
    NSLog(@"from a plain method: SELF is: %p theActiveObject: %p", self, theActiveObject);
    }