【问题标题】:makeObjectsPerformSelector not working on IOS7.1使 Object PerformSelector 在 IOS 7.1 上不起作用
【发布时间】:2014-04-25 04:49:26
【问题描述】:

我有一组按钮(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 中不起作用。我很沮丧地发现这个问题..请任何人帮助我..提前谢谢

【问题讨论】:

  • topFriendsself.topInFriends???顺便说一句,它对我有用
  • 是的,请在 iOS 7.1 设备上测试它..我在 iOS 7.1 模拟器上没有问题..我只有在 7.1 设备上才有问题..
  • 它在 7.1 设备上运行
  • 我真的很抱歉..我忘了提到这个问题只在 iphone 5s(iOS 7.1)..

标签: objective-c ios7 ios7.1


【解决方案1】:

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

标识要发送到数组中对象的消息的选择器。该方法必须接受一个id类型的参数,并且不能有修改接收数组的副作用。

然后我运行这一行

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

它隐藏了按钮,所以无论你传递什么都没关系。这也很有意义,因为您的方法期望 BOOL 并且您正在给它一个对象,我不知道 makeObjectsPerformSelector 的确切内部实现,但我可以得出一些结论

当您传递一些对象时说@"abc"@YES 并且当makeObjectsPerformSelector 调用您的setHidden 时,它会将对象(显然也有一些地址)传递给setHidden 并将您的对象(地址)进入BOOL。 假设您的地址是

@"Fcuked up" ---> 0x7cde450034798976  (assuming 64 bit pointer)
@YES         ---> 0x7cde450000000000

对于第一种情况,BOOL 的值将变为真,因为它的 LSB 非零;对于第二种情况,BOOL 将变为假,因为 LSB 为零。

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

此答案中出现的所有想法都是我的。与其他人的任何相似之处,无论是活着的还是死去的,纯属巧合。

【讨论】:

  • 感谢 Inder 提供您的 cmets..我了解您的 cmets..但我想知道在不使用枚举的情况下隐藏所有按钮的解决方案是什么?
  • 我不认为makeObjectsPerformSelector 内部没有使用枚举。因此,如果您正在使用它,那么就没有害处。如果你不想一遍又一遍地枚举,那么你可以创建 NSArray 的类别并创建你自己的makeObjectsPerformSelector
  • 可能是因为5s中的指针是64位的,而其他的指针是32位的
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-14
    • 1970-01-01
    • 1970-01-01
    • 2013-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多