【问题标题】:call method from other class (self issue)从其他类调用方法(自我问题)
【发布时间】:2013-07-24 01:08:10
【问题描述】:

我真的很想知道这个问题的正确解决方案……如果在 MyOtherClass 中我需要调用 MyMainClass 中的方法,例如我知道如何:

MyMainClass *class = [MyMainClass alloc] init];
[class runSomeMethod];

问题是如果在 runSomeMethod 中我引用 self 它是一个不同的 self 因为它是从 MyOtherClass 调用的不同实例。我理解这一点(并且知道如何解决它),但请有人告诉我处理这个问题的正确方法是什么,并在需要时调用 MyMainClass 的原始实例。谢谢!

【问题讨论】:

  • 如果您需要调用已经实例化的对象上的方法,为什么不将其存储在实例变量或属性中以便以后参考?
  • MyMainClass 中有 MyOtherClass 的对象吗?
  • @AaronBrager 是的,这基本上就是我正在做的事情。
  • @ParagBafna 不。我的意思是 Aaron 说我想访问已经实例化的对象,而不是新的对象。
  • MyMainClass 和 MyOtherClass 有什么联系?

标签: ios macos cocoa object self


【解决方案1】:

您可以使用self 对象来调用该方法,而不是创建自己的类的实例。

然后,当您在方法中引用 self 时,您将使用相同的实例。

所以,你应该把你的方法称为

[self runSomeMethod];

或者,如果您希望您的类始终引用一个对象,您可能需要考虑将您的类创建为单例类,即无论如何 - 您的类将始终发出一个对象。

单一方式

要创建单例类,请转到您的 MyMainClass.h 并添加此属性:

+ (MyMainClass *)singletonInstance;

然后在你的实现文件中,MyMainClass.m 添加如下代码:

//Just below @implementation MyMainClass
static MyMainClass* _singletonInstance = nil;

+(MyMainClass*)singletonInstance
{
@synchronized([MyMainClass class])
{
    if (!_singletonInstance)
        _singletonInstance = [[self alloc] init];
    return _singletonInstance;
}

return nil;
}


+(id)alloc
{
@synchronized([MyMainClass class])
{
    NSAssert(_singletonInstance == nil, @"Attempted to allocate a second instance of a singleton.");
    _singletonInstance = [super alloc];
    return _singletonInstance;
}

return nil;
}

就是这样。现在,当你想调用MyMainClass 的对象时,只需使用[[MyMainClass singletonInstance] runSomeMethod]。 另外,当你现在使用self 时,它会引用同一个对象。

【讨论】:

  • 我明白这一点,但我怎么能从另一个班级调用 self 呢?而且我可能不得不考虑制作一个我实际上不知道该怎么做的单例类。 :-)
  • 已经更新了我上面的答案。如果您将其标记为正确,将不胜感激。
猜你喜欢
  • 1970-01-01
  • 2020-07-29
  • 1970-01-01
  • 1970-01-01
  • 2011-07-02
  • 2022-10-14
相关资源
最近更新 更多