【问题标题】:Objective-C call function on another class?另一个类上的Objective-C调用函数?
【发布时间】:2010-08-26 06:08:40
【问题描述】:

这是我的 Objective-C 类:

AppDelegate
SomeScript

如何从 app-delegate 或任何其他类调用 SomeScript 类上的函数 loggedIn?

谢谢, 克里斯蒂安·斯图尔特

【问题讨论】:

    标签: objective-c class


    【解决方案1】:

    (我假设loggedIn 是一个不带参数的实例方法。)首先,几个术语问题:

    1. 它们不是函数,它们是方法(但想法相同)。
    2. 您不调用方法,您发送消息通常同样的想法,不过)。
    3. 最重要的是,我们通常不会向类发送消息,而是向这些类的实例发送消息。 (如果您无法想象其中的区别,想象一下将一封信放入邮箱的想法与将一封信放入您的邮箱。只有一个有意义!)李>

    所以,我们的新计划是首先实例化 SomeScript,然后向实例发送消息

    SomeScript* myScript = [[SomeScript alloc] init]; //First, we create an instance of SomeScript
    [myScript loggedIn]; //Next, we send the loggedIn message to our new instance
    

    这很好。然而!我敢打赌,您希望您的脚本保留以供以后使用。因此,我们真的应该让它成为您的应用程序委托的实例变量。因此,在 AppDelegate.h 中,将其添加到大括号内:

    SomeScript* myScript;
    

    现在我们的变量将继续存在,我们之前的第一行变得简单:

    myScript = [[SomeScript alloc] init];
    

    最后一个问题:我们不想每次调用loggedIn 时都创建一个新脚本(我假设)!因此,您应该将实例化放置在它只会运行一次的地方(例如,application:DidFinishLaunchingWithOptions:)。哒哒!

    【讨论】:

    • 您需要在发布 myScript 时添加一些内容
    • @JeremyP:在他的 AppDelegate 中。 @ChristianStewart:Jeremy 说得对,你通常应该在完成后将release 发送到myScript。我没有告诉你,因为我假设你会在应用打开的整个过程中使用它。
    • 养成好习惯并没有什么坏处。从技术上讲,您不需要释放您的应用程序委托所持有的任何内容,因为应用程序委托本身会一直保留到最后。但是,养成将发布放在-dealloc 中的习惯是个好主意。它需要变得自动化。
    • 是的,我最终还是这样做了 Jeremy :D
    • 不再使用自动引用计数!
    【解决方案2】:

    你应该在你的 AppDelegate 类中有一个 SomeScript 对象的初始化引用(假设你不需要 SomeScript 像你的 AppDelegate 那样是一个Singleton 类)。比如:

    SomeScript * myScript;

    在您的 AppDelegate 界面中作为 ivar,而在其 application:DidFinishLaunchingWithOptions:

    您已经对其进行了初始化(假设使用默认的 alloc/init 组合调用):

    myScript = [[SomeScript alloc] init]

    做完这一切,当你需要调用 myScript 的方法时,你可以简单地做:

    [myScript myMethod:myParameter]

    Here你可以从 Apple 那里找到一个很好的初学者指南

    【讨论】:

      【解决方案3】:

      如果您不想使用 SomeScript 的实例...您可以采用不同的方法。使用 NSNotificationCenter 向 SomeScript 对象发送通知,然后让它运行选择器。

      在您的 -(void)awakeFromNib{} 方法中,从 SomeScript 中放置以下代码:

        [[NSNotificationCenter defaultCenter] addObserver:self
                                                   selector:@selector(mySelector:)
                                                       name:@"aUniqueNameForTheNotification"
                                                     object:nil];
      

      创建方法“mySelector:”,然后调用您的 loggedIn 方法。 (或者,如果您愿意,可以直接将“mySelector:”替换为loginIn)

      -(void) mySelector:(id)elem
      {
          [self loggedIn];
      }
      

      然后不要忘记删除 dealloc 上的观察者,所以将以下代码也放入您的 SomeScript 类中:

      - (void)dealloc
      {
          [[NSNotificationCenter defaultCenter] removeObserver:self];
      }
      

      然后您可以像这样从任何其他人发送通知:

       [[NSNotificationCenter defaultCenter] postNotificationName:@"aUniqueNameForTheNotification"  object:self];
      

      最后一段代码向 SomeScript 发送通知,然后执行您的选择器。

      希望对大家有帮助!

      【讨论】:

        【解决方案4】:

        我们可以像 [self loggedIn] 那样调用它
        loggedIn 方法在 SomeScript 类中时,使用最新 xcode 中的简单语法。

        [[SomeScript new] loggedIn];
        

        【讨论】:

        • 使用 ARC 不需要解除分配。
        猜你喜欢
        • 2023-03-15
        • 2012-12-19
        • 2019-07-08
        • 1970-01-01
        • 1970-01-01
        • 2015-08-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多