【问题标题】:Need help turning a C function into an Objective C method需要帮助将 C 函数转换为 Objective C 方法
【发布时间】:2014-03-11 19:32:54
【问题描述】:

我有一个用 C 编写的函数,它相当大,目前只在 C 文件的 main() 函数中运行,而我一直在使用它来测试它。这是它的声明

void getData(const char* encodedBuffer, int user);

如果你想查看getData的内容Here是它的pastebin。

到目前为止,我只是传入了 encodedBuffer,我将拥有一个由 getData 函数更新的全局变量。

我想知道将这样的基于 C 的函数转换为 Objective-C 协议方法的正确方法是什么。现在我是这样设置的

iDriver.h(我的接口/协议)

#import <Foundation/Foundation.h>

@protocol iDriver <NSObject>
-(void)getData;
-(void)cancel;

@end

DriverOne.h(实际实现协议方法的类)

#import <Foundation/Foundation.h>
#import "iDriver.h"

@interface DriverOne : NSObject <iDriver>

@end

DriverOne.m

#import "DriverOne.h"

@implementation DriverOne

enum Status getData(char* encodedBuffer, int user)
{
    // Copy C code which I showed in the link earlier
    // to above into this method. I will want it to return a status
    // and populate a global variable with the data.
}

我的想法是,我不应该在这样做时遇到任何问题,因为 Objective-C 是 C 的超集,但只是将 C 代码复制到这样的方法中会有问题吗?

【问题讨论】:

  • stackoverflow.com/questions/19366134/… 我不认为你应该遇到任何问题,但话又说回来,尝试不会有什么坏处。
  • 为什么需要协议?为什么不在 DriverOne 上使用 getDatacancel 方法?
  • @TravisGriggs 因为不久之后我将不得不添加另一个也将使用 getData 的驱动程序。我还将更改 getData 以返回一个名为 status 的枚举类型的结构。我真的只是认为最好有一个可以使用的界面,但我对 C 和 Obj-C 都是新手,所以我可能是错的

标签: objective-c c cocoa oop


【解决方案1】:

将 C 函数移植到 ObjC 方法时,只需对签名进行调整。在你的情况下,你会改变:

enum Status getData(char* encodedBuffer, int user)

类似于:

- (enum Status) getData: (char*) encodedBuffer user: (int) user

Objective C 方法总是以- 开头(类方法以+ 开头)。如果要指定类型,请输入括号(否则假定为类型 id,它是“对象”的通用类型)。而且您必须关键字化您的函数名称。每个参数一个关键字。

然后就像 C 一样,您可以将那行复制粘贴到您的头文件中:

@protocol iDriver <NSObject>
- (enum Status) getData: (char*) encodedBuffer user: (int) user;
@end

之后,只需复制方法内的胆量。

不清楚您对 OO 和实例背后的想法有多熟悉,但使用它可能看起来像:

DriverOne *driverOneObject = [[DriverOne alloc] init];
char *buffer = malloc(YOUR_BUFFER_SIZE);
enumStatus status = [driverObject getData: buffer user: SomeUserThing];

回到原点,您是否有理由希望将其具体化(变成对象)?我自己很喜欢很多对象,但是 ObjectiveC 的一个特点是它是 C 的超集。你可以像从你的 C 原型一样使用你的函数。您不必将其包装在 ObjectiveC 对象中,除非您看到这样做的好处。

【讨论】:

  • 谢谢!那么,复制和粘贴通常是旧 C getData 的内容的内容将与在 C 文件中减去在 main() 中调用的内容相同吗?只要DriverOne.h包含在该文件中,它就可以从另一个类中调用?
  • 我通常在 C# 中工作,所以创建我猜想的对象感觉很正常。我实际上有这个用 C# 编写的相同驱动程序,我只是想转换为 Obj-C 以便在 Mac 上使用它,但我一直对语法感到困惑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-17
  • 1970-01-01
  • 1970-01-01
  • 2011-07-09
相关资源
最近更新 更多