这个:
@interface Blarg:NSObject
@property BOOL flag;
@end
@implementation Blarg
@end
int main(int argc, const char * argv[]) {
@autoreleasepool {
NSArray *a = @[[Blarg new], [Blarg new], [Blarg new]];
NSLog(@"Start %@", [a valueForKey:@"flag"]);
[a setValue:@YES forKey:@"flag"];
NSLog(@"Yes %@", [a valueForKey:@"flag"]);
[a setValue:@NO forKey:@"flag"];
NSLog(@"No %@", [a valueForKey:@"flag"]);
}
return 0;
}
喷这个:
2016-04-14 23:28:00.648 dfjkdf[767:101069] Start (
0,
0,
0
)
2016-04-14 23:28:00.650 dfjkdf[767:101069] Yes (
1,
1,
1
)
2016-04-14 23:28:00.650 dfjkdf[767:101069] No (
0,
0,
0
)
对吗?有点。一般来说,这不是你应该使用的模式。
你最好做这样的事情:
[a enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
Blarg *b = obj;
b.flag = YES;
}];
或者,使用现代编译器会更好:
[a enumerateObjectsUsingBlock:^(Blarg * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
obj.flag = YES;
}];
这是几行额外的代码,但它的类型是正确的,因此,如果将来代码更改以破坏它,编译器会尖叫。元编程阻碍了编译器帮助您的能力。