makeObjectsPerformSelector不适用于IOS7.1

时间:2014-04-25 04:49:26

标签: objective-c ios7 ios7.1

我有一系列按钮(IBOutletCollections)名称" topFriends" ..我需要设置隐藏topFriends的所有按钮(数组名称)。

[self.topInFriends makeObjectsPerformSelector:@selector(setHidden:) withObject:[NSNumber numberWithBool:YES]];

实际上它在iOS7上工作......但它不适用于iOS 7.1。

但是当我尝试枚举数组如下,那么它适用于iOS7和7.1

[self.topInFriends enumerateObjectsUsingBlock:^(UIButton * obj, NSUInteger idx, BOOL *stop) {
        obj.hidden=YES;
    }];

任何人都可以告诉我为什么makeObjectsPerformSelector功能在iOS 7.1中不起作用。我真的很沮丧地找到问题..请任何人帮助我......提前谢谢

2 个答案:

答案 0 :(得分:5)

我是从makeObjectsPerformSelector的文档中得到的,这是此方法中参数SEL的描述

一个选择器,用于标识要发送到阵列中对象的消息。方法必须采用类型为id 的单个参数,并且不得具有修改接收数组的副作用。

然后我运行这一行

[self.topInFriends makeObjectsPerformSelector:@selector(setHidden:)
                                   withObject:@"Fcuked up"];

它隐藏了按钮,所以你传递的内容并不重要。这也是有意义的,因为你的方法期望BOOL并且你给它一个对象,我不知道makeObjectsPerformSelector的确切内部实现,但我可以得出一些结论

当您传递某个对象时,请说@"abc"@YES,当makeObjectsPerformSelector调用您的setHidden时,它的传递对象(显然也有一些地址)也会{{1}它将您的对象(地址)转换为setHidden。 假设您的地址是

BOOL

对于第一种情况,@"Fcuked up" ---> 0x7cde450034798976 (assuming 64 bit pointer) @YES ---> 0x7cde450000000000 的值将变为真,因为它的LSB不为零;对于第二种情况,BOOL将变为假,因为LSB为零。

总的来说,你应该尊重苹果文档,你不应该调用一个不带参数的方法BOOL

这个答案中出现的所有想法都是我的。与生活或死亡的其他人有任何相似之处纯属巧合。

答案 1 :(得分:1)

改为使用[self.topInFriends setValue:@YES forKey:@"hidden"];