Rumah > Soal Jawab > teks badan
unsigned int count;
//在运行时创建继承自NSObject的People类
Class People = objc_allocateClassPair([NSObject class], "People", 0);
//完成People类的创建
objc_registerClassPair(People);
objc_property_attribute_t type = {"T", "@\"NSString\""};
objc_property_attribute_t attribute2 = {"N",""};//value无意义时通常设置为空
objc_property_attribute_t ownership = { "C", "" };
objc_property_attribute_t backingivar = { "V", "_pro"};
objc_property_attribute_t attrs[] = {type,attribute2, ownership, backingivar};
//向People类中添加名为pro的属性,属性的4个特性包含在attributes中
BOOL y = class_addProperty(People, "pro", attrs, 4);
NSLog(@"%d",y);
//创建People对象p1
id p1 = [[People alloc]init];
objc_property_t * properties = class_copyPropertyList(People, &count);
for (int i = 0; i<count; i++) {
NSLog(@"属性的名称为 : %s",property_getName(properties[i]));
NSLog(@"属性的特性字符串为: %s",property_getAttributes(properties[i]));
}
//请问怎么为pro赋值?
大家讲道理2017-04-18 09:54:57
- (void)dynamic2{
unsigned int count;
//在运行时创建继承自NSObject的People类
Class People = objc_allocateClassPair([NSObject class], "People", 0);
NSString *proName = @"pro";
class_adpar(People, [proName cStringUsingEncoding:NSUTF8StringEncoding], sizeof(NSString *), log2(sizeof(NSString*)), @encode(NSString*));
//完成People类的创建
objc_registerClassPair(People);
objc_property_attribute_t type = {"T", "@\"NSString\""};
objc_property_attribute_t attribute2 = {"N",""};//value无意义时通常设置为空
objc_property_attribute_t ownership = { "C", "" };
objc_property_attribute_t backingivar = { "V", [proName cStringUsingEncoding:NSUTF8StringEncoding]};
objc_property_attribute_t attrs[] = {type,attribute2, ownership, backingivar};
//向People类中添加名为pro的属性,属性的4个特性包含在attributes中
if (class_addProperty(People, [proName cStringUsingEncoding:NSUTF8StringEncoding], attrs, 4)) {
NSString *s = [NSString stringWithFormat:@"set%@:",[proName capitalizedString]];
//添加get和set方法
class_addMethod([People class], NSSelectorFromString(proName), (IMP)getter, "@@:");
class_addMethod([People class], NSSelectorFromString(s), (IMP)setter, "v@:@");
}
//创建People对象p1
id p1 = [[People alloc]init];
objc_property_t * properties = class_copyPropertyList(People, &count);
for (int i = 0; i<count; i++) {
NSLog(@"属性的名称为 : %s",property_getName(properties[i]));
NSLog(@"属性的特性字符串为: %s",property_getAttributes(properties[i]));
}
[p1 setValue:@"111" forKey:@"pro"];
NSLog(@"%@", [p1 valueForKey:@"pro"]);
}
id getter(id self1, SEL _cmd1) {
NSString *key = NSStringFromSelector(_cmd1);
Ivar ivar = class_getInstanceVariable([self1 class], [key cStringUsingEncoding:NSUTF8StringEncoding]);
NSString *s = object_getIvar(self1, ivar);
return s;
}
void setter(id self1, SEL _cmd1, id newValue) {
//移除set
NSString *key = [NSStringFromSelector(_cmd1) stringByReplacingCharactersInRange:NSMakeRange(0, 3) withString:@""];
//首字母小写
NSString *head = [key substringWithRange:NSMakeRange(0, 1)];
head = [head lowercaseString];
key = [key stringByReplacingCharactersInRange:NSMakeRange(0, 1) withString:head];
//移除后缀 ":"
key = [key stringByReplacingCharactersInRange:NSMakeRange(key.length - 1, 1) withString:@""];
Ivar ivar = class_getInstanceVariable([self1 class], [key cStringUsingEncoding:NSUTF8StringEncoding]);
object_setIvar(self1, ivar, newValue);
迷茫2017-04-18 09:54:57
Mengikut kaedah yang anda tambah, ini juga mungkin
SEL setter = NSSelectorFromString(@"setPro:");
SEL getter = NSSelectorFromString(@"pro");
if ([p1 respondsToSelector:setter] && [p1 respondsToSelector:getter]) {
[p1 performSelector:setter withObject:@"NBA"];
id d = [p1 performSelector:getter withObject:nil];
NSLog(@"d,%@",d);
}
PHP中文网2017-04-18 09:54:57
Mereka semua adalah pakar yang hebat. Sila beritahu saya saya tidak pernah mempelajari sintaks ini.
Apakah jenis pengetahuan yang dimiliki oleh tatabahasa ini? Di manakah ia biasa digunakan? Terima kasih atas jawapan anda~ Saya mahu menguasai tatabahasa yang kelihatan keren ini~~~~