亲测 makeObjectsPerformSelector 的用法。
1 - (void)makeObjectsPerformSelector:(SEL)aSelector NS_SWIFT_UNAVAILABLE("Use enumerateObjectsUsingBlock: or a for loop instead"); 2 - (void)makeObjectsPerformSelector:(SEL)aSelector withObject:(nullable id)argument NS_SWIFT_UNAVAILABLE("Use enumerateObjectsUsingBlock: or a for loop instead");
苹果提供,NSSet 和 NSArray 的两个接口。大概意思:
方法1:集合或数组里面的每一个元素都去执行 aSelector 。
方法2:集合或数组里面的每一个元素都去执行 aSelector 。且把 withObject 后边的 argument 对象做为参数传给方法 aSelector。
Test1:
1 #pragma mark - View lifeCycle 2 - (void)viewDidLoad { 3 [super viewDidLoad]; 4 self.view.backgroundColor = [UIColor colorWithRed:1.000 green:0.814 blue:0.614 alpha:1.000]; 5 [self.view addSubview:self.a]; 6 [self.view addSubview:self.b]; 7 [self.view addSubview:self.c]; 8 [self.view addSubview:self.d]; 9 [self.array addObjectsFromArray:@[self.a, self.b, self.c, self.d]]; 10 [self performSelector:@selector(doIt) withObject:nil afterDelay:1.f]; 11 } 12 13 - (void)doIt { 14 [self.array makeObjectsPerformSelector:@selector(setHidden:) withObject:@YES]; 15 }
事实证明,1.秒之后,数组里面的四个UILabel对象都会被 Hidden。
Test2:
Selector 方法选择器中的方法执行之后,数组里面元素的属性是否发生了改变?(摘自<Stack Overflow>的问题)
1 - (void)doIt { 2 [self.array makeObjectsPerformSelector:@selector(setTitle)]; 3 for (UILabel *obj in self.array) { 4 NSLog(@"obj = %@", obj.text); 5 } 6 }
打印结果如下:
1 2016-03-16 14:24:08.517 Demo_Test[2519:310351] obj = 这是一个测试 2 2016-03-16 14:24:08.518 Demo_Test[2519:310351] obj = 这是一个测试 3 2016-03-16 14:24:08.518 Demo_Test[2519:310351] obj = 这是一个测试 4 2016-03-16 14:24:08.519 Demo_Test[2519:310351] obj = 这是一个测试
事实证明,使用 makeObjectsPerformSelector 之后,数组元素的属性的确发生了变化。
部分说明:
其中 self.a 是 MyLabel 的实例。 MyLabel 继承自 UILabel @interface MyLabel : UILabel /** 改变背景颜色 */ - (void)setBGColor; /** 改变文字 */ - (void)setTitle; @end
疑问:关于这个 aSelector 方法选择器的方法,只能是数组元素的类所拥有的方法接口??
如果存在错误,欢迎批评指正!
尊重作者劳动成果,转载请注明: 转载自【kingdev】