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
According to the method you added, this is also possible
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
They are all great masters. Please tell me. I have never learned these syntaxes. What is the most commonly used syntax in Objective-C?
What kind of knowledge do these grammars belong to? Where is it commonly used? Thank you for your answer~ I want to master these cool-looking grammar~~~~