gpt4 book ai didi

objective-c - 如何在运行时向对象添加属性?

转载 作者:IT老高 更新时间:2023-10-28 11:43:59 27 4
gpt4 key购买 nike

是否可以在运行时向 Objective C 对象添加属性?

最佳答案

可以通过class_addProperty()为类添加形式属性:

BOOL class_addProperty(Class cls,
const char *name,
const objc_property_attribute_t *attributes,
unsigned int attributeCount)

前两个参数是不言自明的。第三个参数是一个property属性数组,每个property属性都是一个name-value对,遵循Objective-C type encodings对于 declared properties .请注意,文档仍然提到了用于属性属性编码的逗号分隔字符串。逗号分隔字符串中的每个段都由一个 objc_property_attribute_t 实例表示。此外,除了 id 的通用 @ 类型编码之外,objc_property_attribute_t 还接受类名。

这是一个程序的初稿,该程序将一个名为 name 的属性动态添加到一个已经有一个名为 _privateName 的实例变量的类中:

#include <objc/runtime.h>
#import <Foundation/Foundation.h>

@interface SomeClass : NSObject {
NSString *_privateName;
}
@end

@implementation SomeClass
- (id)init {
self = [super init];
if (self) _privateName = @"Steve";
return self;
}
@end

NSString *nameGetter(id self, SEL _cmd) {
Ivar ivar = class_getInstanceVariable([SomeClass class], "_privateName");
return object_getIvar(self, ivar);
}

void nameSetter(id self, SEL _cmd, NSString *newName) {
Ivar ivar = class_getInstanceVariable([SomeClass class], "_privateName");
id oldName = object_getIvar(self, ivar);
if (oldName != newName) object_setIvar(self, ivar, [newName copy]);
}

int main(void) {
@autoreleasepool {
objc_property_attribute_t type = { "T", "@\"NSString\"" };
objc_property_attribute_t ownership = { "C", "" }; // C = copy
objc_property_attribute_t backingivar = { "V", "_privateName" };
objc_property_attribute_t attrs[] = { type, ownership, backingivar };
class_addProperty([SomeClass class], "name", attrs, 3);
class_addMethod([SomeClass class], @selector(name), (IMP)nameGetter, "@@:");
class_addMethod([SomeClass class], @selector(setName:), (IMP)nameSetter, "v@:@");

id o = [SomeClass new];
NSLog(@"%@", [o name]);
[o setName:@"Jobs"];
NSLog(@"%@", [o name]);
}
}

它的(修剪后的)输出:

Steve
Jobs

getter 和 setter 方法应该更仔细地编写,但这应该足以作为如何在运行时动态添加正式属性的示例。

关于objective-c - 如何在运行时向对象添加属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7819092/

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