c语言中目标方法,在C语言中你不能做的,在目标C语言中你可以做的?

我会有点自以为是,不同意其他人的意见。虽然从技术上讲,一种语言中的任何可能在另一种语言中都是可能的(其中“可能”的意思是“可计算的”),但它们在你能表达的内容上是不同的。

自然地

容易地

. 计算机可能对你用C语言写的代码做同样的事情,但是

正在写完全不同的代码来让它做那些事情。

正如其他人所说,Objective-C提供了一个用C编写的完整的运行时库,它允许您创建Objective-C数据结构并调用C函数,但是这样做的代码将是非常冗长、相当迂回且完全必要的。在objective-c中,代码更具声明性、更简洁和可读性。

一般来说,试图用C语言编写objective-c的东西只会使代码比使用任何一种语言更糟糕。例如,这里有一个用Objective-C编写的简单程序:

@interface NumberAdder : NSObject {

int storedValue;

}

- (id)initWithStoredValue:(int)value;

- (int)resultOfAddingStoredValue:(int)numberToAdd;

@end

@implementation NumberAdder

- (int)resultOfAddingStoredValue:(int)numberToAdd {

return numberToAdd + storedValue;

}

- (id)initWithStoredValue:(int)value {

if (!(self = [super init])) return nil;

storedValue = value;

return self;

}

@end

int main() {

id adder = [[NumberAdder alloc] initWithStoredValue:4];

int result = [adder resultOfAddingStoredValue:3];

printf("It is %d\n", result);

return 0;

}

下面是用C编写的与Objective-C运行时相同的东西(没有测试,但应该大致正确):

int returnPlusStoredValueImp(id self, SEL _cmd, int arg) {

int *storedValue = nil;

object_getInstanceVariable(self, "storedValue", &storedValue)

return arg + *storedValue;

}

id numberAdderInit(id self, SEL _cmd, int valueToStore) {

objc_super superInfo = {self, objc_lookupClass("NSObject")};

self = objc_msgSendSuper(super_info, sel_getName("init"));

if (!self) return nil;

object_setInstanceVariable(self, "storedValue", &valueToStore);

return self;

}

void createNumberAdderClass() __attribute(constructor)__ {

Class NumberAdder = objc_allocateClassPair(objc_lookupClass("NSObject"), "NumberAdder", 0);

if (!NumberAdder) return;

class_addIvar(NumberAdder, "storedValue", sizeof(int), 4, "i"); // I'm actually not sure if the fourth argument is correct, so it's probably wrong, but just take that as a sign of how much this way of coding sucks

objc_registerClassPair(NumberAdder);

SEL nameOfPlusStoredValue = sel_registerName("resultOfAddingStoredValue:");

SEL nameOfInit = sel_registerName("initWithStoredValue:");

class_addMethod(NumberAdder, nameOfPlusStoredValue, returnPlusStoredValueImp, "i@:i");

class_addMethod(NumberAdder, nameOfInit, numberAdderInit, "@@:i");

}

int main() {

id adder = objc_msgSend(objc_lookupClass("NumberAdder"), sel_getName"alloc");

adder = objc_msgSend(adder, sel_getName("initWithStoredValue:"), 4);

int result = (int)objc_msgSend(adder, sel_getName("resultOfAddingStoredValue:"), 3);

printf("It is %d\n", result);

return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值