Objective-C ARC:如何转换(void*)作为参数传递的YES?
我有一组视图,需要将它们全部隐藏,因此我使用:Objective-C ARC:如何转换(void*)作为参数传递的YES?,objective-c,automatic-ref-counting,selector,Objective C,Automatic Ref Counting,Selector,我有一组视图,需要将它们全部隐藏,因此我使用: BOOL shouldHideViews = YES; [allViews makeObjectPerformSelector:@selector(setHidden:) withObject:(void *)shouldHideViews] 当我将代码转换为ARC时,它告诉我需要一些桥接转换,然后我更改了: (void *)shouldHideViews 到 它说不兼容的类型通过桥转换将int转换为BOOL 那我该怎么做呢?我知道我可以迭代数
BOOL shouldHideViews = YES;
[allViews makeObjectPerformSelector:@selector(setHidden:) withObject:(void *)shouldHideViews]
当我将代码转换为ARC时,它告诉我需要一些桥接转换,然后我更改了:
(void *)shouldHideViews
到
它说不兼容的类型通过桥转换将int转换为BOOL
那我该怎么做呢?我知道我可以迭代数组中的所有视图,但这不是重点,我想知道我应该怎么做才能使这个ARC兼容
谢谢 不能将基元类型作为空指针传递。您应该将布尔变量保持为实例变量,并在setHidden中引用它。这样你就可以做到:
shouldHideViews = YES; //declare BOOL shouldHideViews; in your .h file
[allViews makeObjectPerformSelector:@selector(setHidden) withObject:nil];
不能将基元类型作为空指针传递。您应该将布尔变量保持为实例变量,并在setHidden中引用它。这样你就可以做到:
shouldHideViews = YES; //declare BOOL shouldHideViews; in your .h file
[allViews makeObjectPerformSelector:@selector(setHidden) withObject:nil];
这些对你很有帮助
您应该使用
NSNumber
或使用NSInvocation
制作包装 这些会对你很有帮助
您应该使用
NSNumber
或使用NSInvocation
制作包装 makeObjectsPerformSelector:withObject:的object
参数的类型为id
。这意味着它需要指向Objective-C对象。将非对象强制转换为id
是一个坏主意,因为系统(特别是在ARC下)可以执行诸如将retain
和release
消息发送到id
,如果将YES
强制转换为id
,系统将崩溃
我建议只使用快速枚举:
for (UIView *view in allViews) {
view.hidden = shouldHideViews;
}
makeObjectsPerformSelector:withObject:
的object
参数的类型为id
。这意味着它需要指向Objective-C对象。将非对象强制转换为id
是一个坏主意,因为系统(特别是在ARC下)可以执行诸如将retain
和release
消息发送到id
,如果将YES
强制转换为id
,系统将崩溃
我建议只使用快速枚举:
for (UIView *view in allViews) {
view.hidden = shouldHideViews;
}
其他表明您不能通过此方式的答案是正确的。但是,有更简单的解决方案:
[allViews setValue:[NSNumber numberWithBool: shouldHideViews] forKey:@"hidden"];
这是因为NSArray会覆盖它的setValue:forKey:
,以实现此用途
现在还可以使用块:
[allViews enumerateObjectsUsingBlock:
^(id obj, NSUInteger idx, BOOL *stop){ [obj setHidden:shouldHideViews];}];
或者是久经考验的for()
循环(参见@rob mayoff的答案)
其中,我通常只使用
来进行循环。其他表示无法通过YES
的答案是正确的。但是,有更简单的解决方案:
[allViews setValue:[NSNumber numberWithBool: shouldHideViews] forKey:@"hidden"];
这是因为NSArray会覆盖它的setValue:forKey:
,以实现此用途
现在还可以使用块:
[allViews enumerateObjectsUsingBlock:
^(id obj, NSUInteger idx, BOOL *stop){ [obj setHidden:shouldHideViews];}];
或者是久经考验的for()
循环(参见@rob mayoff的答案)
其中,我通常只使用进行循环。完成使用arc进行自动参考计数问题。这里的解释:这是ARC之前的一段工作代码吗?@dasblinkenlight,是的,它神奇地工作了。我上星期刚碰到另一个人在做这件事。我相信它会变成指向0x1的指针,它只是作为一个“足够真实”的方式在系统中运行。完成了使用arc自动参考计数问题。这里的解释:这是ARC之前的一段工作代码吗?@dasblinkenlight,是的,它神奇地工作了。我上星期刚碰到另一个人在做这件事。我相信它会变成一个指向0x1的指针,它只是作为一个“足够真实”在系统中运行。我知道你在说什么,但是setHidden:是UIView中的一个方法,我有一个视图数组,所以它不是我可以控制的东西,除非我对视图进行子类化。子类NSArray!您可以在子类NSArray中创建一个方法,将setHidden:发送到数组中的所有UIView。确保在循环遍历数组中的所有对象时,在发送setHidden:之前检查它是否为UIView,否则您的应用程序将崩溃。我知道您在说什么,但setHidden:是UIView中的一个方法,我有一个视图数组,因此除非我对视图进行子类化,否则我无法控制它。子类NSArray!您可以在子类NSArray中创建一个方法,将setHidden:发送到数组中的所有UIView。确保在循环遍历数组中的所有对象时,在发送setHidden:之前检查它是否为UIView,否则你的应用程序将崩溃。是的,我个人也喜欢快速枚举,但出于任何原因,OP不喜欢该答案。是的,我个人也喜欢快速枚举,但无论出于什么原因,OP都不喜欢这个答案。