Objective C 中类似 Java 的接口(interface)

标签 java objective-c oop interface

我正在尝试开始使用 Objective-c 进行 iOS 开发。我在 Java 方面有很多经验,所以我尝试用 Java 的方式做事。请帮助我理解在 Objective C 中编码的正确方法。

我有以下 Java 接口(interface):

public interface MyInterface {
  void onSuccess(String successString);
  void onError(String errorMessage);
}

我会这样使用它:

public static void main(String... args){
    MyInterface interface = new MyInterface() {
        @Override
        public void onSuccess(String successMessage) {
            // things happen here
        }

        @Override
        public void onError(String errorMessage) {

        }
    };
}

如何将此代码转换为 Objective C?我需要创建一个接口(interface)并将该接口(interface)的实例传递给另一个 C 方法。

我尝试过blocks(^),但只有当我需要传递一个只有一个回调的对象时才可以接受。将具有两个回调函数的对象传递给方法的方法是什么?

最佳答案

I have only one *void argument that i can pass as a handle, so i need to pass two blocks in one object reference

一种方法是定义一个,其中包含两个 block 类型的实例变量,每个用于成功和错误情况;一个初始化程序,它获取值( block )并设置这些实例变量;以及两个实例方法,每个成功和失败情况各一个,它们只是调用相应实例变量引用的 block 。

如果您需要接口(interface),因为其他类将直接实现它,只需让您的新类也符合它即可。

另一种方法是使用两个 block 值属性定义类,并使用属性引用来获取 block 而不是调用它们的方法。

当您将类实例作为 void * 传递,然后将其转换回使用方法/属性时,棘手的部分就出现了。如果您使用 ARC,则需要在两个方向上使用桥接转换,并确保您的对象在需要之前保持 Activity 状态。您可以通过在调用站点使用强制转换来实现此目的,该强制转换将对象的所有权从 ARC 转移出去,从而防止 ARC 释放它;在使用站点进行强制转换,将所有权转移回 ARC,以便在调用适当的方法/属性后,ARC 将清理该对象。您需要阅读桥接类型转换才能做到这一点;它们的编写并不比普通的转换更复杂,但您确实需要理解语义。

当然,此时,尤其是在使用桥接转换进行手动内存管理之后,您可能会决定从 Java 模型切换到更面向 Objective-C 的模型。然而,上述是处理遵循 void * 上下文指针模型的 C 函数的标准技术,在需要时使用它本身没有任何错误。 p>

HTH

关于Objective C 中类似 Java 的接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48463706/

相关文章:

Java:从终端读取输入提示

iphone - 除 CORONA 之外适用于 iphone/ipad 的任何其他游戏 SDK

ios - UIImageView动画太耗内存

c++ - 为什么 `*this` 解析为子类?

c++ - 使用 ostream 和枚举类型重载 <<

OOP:应该将多少程序逻辑作为方法封装在相关对象/类中?

java - Gmail Java 库

java - XML 读出嵌套内容

java - 带有 sudo 的 Raspberry Pi NetBeans 运行 jar

ios - 选择/取消选择随机多个日期