检查设备iOS平台中是否存在重载方法

Rob*_*Mao 3 iphone objective-c ios

ALAssetsLibrary类中有2个"writeImageToSavedPhotosAlbum"方法:

- (void)writeImageToSavedPhotosAlbum:(CGImageRef)imageRef 
                            metadata:(NSDictionary *)metadata 
                     completionBlock:(ALAssetsLibraryWriteImageCompletionBlock)completionBlock  
Run Code Online (Sandbox Code Playgroud)

(适用于iOS 4.1+)

- (void)writeImageToSavedPhotosAlbum:(CGImageRef)imageRef 
                         orientation:(ALAssetOrientation)orientation
                     completionBlock:(ALAssetsLibraryWriteImageCompletionBlock)completionBlock
Run Code Online (Sandbox Code Playgroud)

(适用于iOS 4.0+)

我在我的代码中使用第一个(需要iOS 4.1),它将在iOS 4.0设备上崩溃.我试图用来respondsToSelector检查支持哪种方法,但看起来像选择器只检查方法名称,而不是参数.

我读了一些建议,觉得纯粹检查操作系统版本可能不太好,所以有什么类似于respondstoselector可以帮我解决这个问题吗?

jtb*_*des 7

这些方法具有不同的名称,因此您可以单独测试它们.

if ([assetsLibrary respondsToSelector:
     @selector(writeImageToSavedPhotosAlbum:metadata:completionBlock:)]) {
    // Now you can safely use this method.
}
Run Code Online (Sandbox Code Playgroud)

如果你想测试另一个你会使用的@selector(writeImageToSavedPhotosAlbum:orientation:completionBlock:).


Yuj*_*uji 7

您误解了Objective-C方法命名系统.选择器是所有 foo:bar:baz: 组合的组合.因此,在这种情况下,没有调用方法writeImageToSavedPhotosAlbum.第一个是,作为选择器,对应于

@selector(writeImageToSavedPhotosAlbum:metadata:completionBlock:)
Run Code Online (Sandbox Code Playgroud)

第二个是

@selector(writeImageToSavedPhotosAlbum:orientation:completionBlock:)
Run Code Online (Sandbox Code Playgroud)

在您的代码中,检查第一个选择器是否可用,如

if([obj respondsToSelector:@selector(writeImageToSavedPhotosAlbum:metadata:completionBlock:)]){
      ....
}
Run Code Online (Sandbox Code Playgroud)

这应该区分第一个是否可用.