Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/97.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 将对象(UIViewController)强制转换为其未知子类_Objective C_Ios - Fatal编程技术网

Objective c 将对象(UIViewController)强制转换为其未知子类

Objective c 将对象(UIViewController)强制转换为其未知子类,objective-c,ios,Objective C,Ios,我已经为滑动UIView开发了一个通用控制器,我管理UIViewController(显然还有子类),并且只有当UIViewController的子类响应此方法时,才必须调用特定方法(冻结): -(void)freezeRootViewController { if([_rootViewController respondsToSelector:@selector(freeze)]) [ ((id) _rootViewController) freeze]; } 我不知

我已经为滑动UIView开发了一个通用控制器,我管理UIViewController(显然还有子类),并且只有当UIViewController的子类响应此方法时,才必须调用特定方法(冻结):

-(void)freezeRootViewController
{
    if([_rootViewController respondsToSelector:@selector(freeze)])
        [ ((id) _rootViewController) freeze];
}
我不知道_rootViewController的类,但我知道它是UIViewController的子类,因此我尝试将我的_rootViewController强制转换为ID,但我无法编译:

环境:XCode 4.5.1、iOs 4.3+和ARC

错误:“选择器‘冻结’的实例方法未知”

注意:我不能强制开发人员为_rootViewController使用特定的UIViewController子类。

这似乎是一个警告,而不是一个错误-您应该能够编译代码并忽略此诊断消息。但是,如果您想完全摆脱它,可以声明一个协议并按如下方式执行强制转换:

@protocol MyProtocol <NSObject>

- (void)freeze;

@end

[(id <MyProtocol>)_rootViewController freeze];
@protocol-MyProtocol
-(b)冻结;
@结束
[(id)_rootviewcontrollerfreeze];
这似乎是一个警告,而不是一个错误-您应该能够编译代码并忽略此诊断消息。但是,如果您想完全摆脱它,可以声明一个协议并按如下方式执行强制转换:

@protocol MyProtocol <NSObject>

- (void)freeze;

@end

[(id <MyProtocol>)_rootViewController freeze];
@protocol-MyProtocol
-(b)冻结;
@结束
[(id)_rootviewcontrollerfreeze];
检查“泛型”类型是否响应选择器后,使用
performSelector:
/
performSelector:withObject:
调用它,如果它是一个简单的0-1参数方法,则使用。由于
freeze
没有参数,因此您只需使用
performSelector:

-(void)freezeRootViewController
{
    if([_rootViewController respondsToSelector:@selector(freeze)])
        [_rootViewController performSelector:@selector(freeze)];
}
检查“泛型”类型是否响应选择器后,您可以使用
performSelector:
/
performSelector:withObject:
调用它,如果它是一个简单的0-1参数方法,则使用。由于
freeze
没有参数,因此您只需使用
performSelector:

-(void)freezeRootViewController
{
    if([_rootViewController respondsToSelector:@selector(freeze)])
        [_rootViewController performSelector:@selector(freeze)];
}


这不是一个警告而不是一个错误吗?@H2CO3不,XCode 4.5.1,iOs 4.3+带ARC,不要编译。请看我的答案,这应该会有帮助(顺便说一句,把这变成一个错误是没有大脑的)。这也与XCode的版本无关,也与clang/GCC的版本无关,它似乎与正在使用的ARC有关。请导入定义
freeze
方法的头文件。这会让编译器高兴。这不是一个警告而不是一个错误吗?@H2CO3不,XCode 4.5.1,iOs 4.3+和ARC,不要编译。看我的答案,这应该会有帮助(顺便说一句,把这变成一个错误是没有大脑的)。这也与XCode的版本无关,也与clang/GCC的版本无关,它似乎与正在使用的ARC有关。请导入定义
freeze
方法的头文件。这将使编译器感到高兴。不,这是一个错误,但是如果我只在类中添加协议(没有cast!!),所有的工作都会很好!谢谢;)@Kappe请在您有能力的情况下接受/更新我的答案,谢谢。@H2CO3:请注意:使用ARC,您无法编译未知的方法选择器。请参阅例如,有人说这是一个故意的决定,使其成为一个错误而不是一个警告。@MartinR,但它仍然没有意义(顺便说一下,感谢链接)。如果方法返回
id
,编译器仍然可以发出强/弱引用;如果它没有(或者如果返回值被强制转换),它就不应该做任何事情。我不同意这种方法。Kappe已选中
响应选择器:
,因此应使用
性能选择器:
。在强制转换到协议之前,您应该检查它是否符合协议:。不,这是一个错误,但是如果我只将协议添加到我的类中(没有强制转换!!),那么所有这些都可以完美地工作!谢谢;)@Kappe请在您有能力的情况下接受/更新我的答案,谢谢。@H2CO3:请注意:使用ARC,您无法编译未知的方法选择器。请参阅例如,有人说这是一个故意的决定,使其成为一个错误而不是一个警告。@MartinR,但它仍然没有意义(顺便说一下,感谢链接)。如果方法返回
id
,编译器仍然可以发出强/弱引用;如果它没有(或者如果返回值被强制转换),它就不应该做任何事情。我不同意这种方法。Kappe已选中
响应选择器:
,因此应使用
性能选择器:
。在转换到协议之前,您应该检查它是否符合协议:。