gpt4 book ai didi

objective-c - 哪些在 C 语言中不能做但在 Objective-C 中可以做的事情?

转载 作者:太空狗 更新时间:2023-10-30 03:46:43 27 4
gpt4 key购买 nike

有哪些在 C(C99 标准)中不能做而在 Objective-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;
}

下面是使用 Objective-C 运行时用 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;
}

关于objective-c - 哪些在 C 语言中不能做但在 Objective-C 中可以做的事情?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3038154/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com