【问题标题】:Calling a method from another class in Objective-C [closed]从Objective-C中的另一个类调用方法[关闭]
【发布时间】:2013-03-05 23:25:58
【问题描述】:

我正在尝试掌握 Objective-C,过去曾使用 Java 和 C 进行过编程。

我有一个类,Unzip,它包含以下方法:

- (void)unzipFile:(NSString*)fileName

我正在尝试从 AppDelegate 类调用此方法,以响应按钮单击,使用以下代码创建 Unzip 实例并使用字符串值调用 unzipFile 方法,但没有任何反应。

- (IBAction)unzipIt:(id)sender {
    NSLog(@"Unzip clicked");
    NSString *zipString = [_testField stringValue];

    NSLog(@"Calling unzip with the string %@", zipString);
    Unzip *unzip;
    [unzip unzipFile:(zipString)]; 
}

实际的按钮点击有效,因为两个初始 NSLog 出现了,但没有进一步发生。该方法很好,因为我已经在其他地方进行了测试,因此至少应该发生 something。谁能告诉我哪里出错了?

感谢您的宝贵时间。

【问题讨论】:

  • 您没有创建实例,只是声明了一个指向实例的指针。改为使用Unzip *unzip = [[Unzip alloc] init]; 来实际实例化一个。
  • 你从不初始化解压缩。这在 java 或 C 中也行不通
  • @Daij-Djan 除了在 Java 或 C 中,至少会出现运行时错误。
  • @MikeD 是的。 Objective-C 不做 nullPointerExceptions
  • @Daij-Djan 只是指出 OP 的不同之处。

标签: objective-c macos class methods call


【解决方案1】:

你没有分配Unzip

Unzip *unzip = [[Unzip alloc] init];
[unzip unzipFile:zipString];

它不工作但没有炸毁的原因是在Objective C中,向nil发送消息是安全的。

一些more concepts about Objective C,尤其是在Working with Nil部分。

【讨论】:

  • 啊,我真笨。谢谢。
  • @MarkRandell 不用担心。来自 Java 或 C,你希望这样的东西要么不能编译,要么在运行时抛出异常。
【解决方案2】:

你必须初始化你的 unzip 变量

Unzip *unzip = [[Unzip alloc] init];

还有一个捷径:

Unzip *unzip = [Unzip new];

相当于速记。

【讨论】:

  • 不要调用 new,约定是 alloc + init 或者你自己的方便方法..
  • @Daij-Djan 为什么会这样?
  • @JoshHudnall 这比什么都重要。有些人认为 new 是简单的出路,但它可能有副作用。
  • @Daij-Djan 根据我的研究,它相当于 [[alloc] init]。甚至 Apple 在某些情况下也会使用它。据我了解,这是个人喜好问题。
猜你喜欢
  • 1970-01-01
  • 2015-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-15
  • 2015-08-01
  • 1970-01-01
相关资源
最近更新 更多