两个类别在同一个类上具有相同的方法名称

时间:2013-02-06 03:56:47

标签: objective-c afnetworking sdwebimage

我注意到UIImageView上的AFNetworking和SDWebImage类别具有相同的方法名称。

AFNetworking:

- (void)setImageWithURL:(NSURL *)url {
    [self setImageWithURL:url placeholderImage:nil];
}

- (void)setImageWithURL:(NSURL *)url 
       placeholderImage:(UIImage *)placeholderImage
{
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
    [request setHTTPShouldHandleCookies:NO];
    [request addValue:@"image/*" forHTTPHeaderField:@"Accept"];

    [self setImageWithURLRequest:request placeholderImage:placeholderImage success:nil failure:nil];
}

- (void)setImageWithURLRequest:(NSURLRequest *)urlRequest 
              placeholderImage:(UIImage *)placeholderImage 
                       success:(void (^)(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image))success
                       failure:(void (^)(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error))failure
{
...
}

和SDWebImage

- (void)setImageWithURL:(NSURL *)url
{
    [self setImageWithURL:url placeholderImage:nil options:0 progress:nil completed:nil];
}

- (void)setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder
{
    [self setImageWithURL:url placeholderImage:placeholder options:0 progress:nil completed:nil];
}

- (void)setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options
{
    [self setImageWithURL:url placeholderImage:placeholder options:options progress:nil completed:nil];
}

...

在Xcode中,当我命令单击SDWebImage方法时,它会将我重定向到AFNetworking方法,反之亦然。

我可以期待哪种行为?我是否应该只在类I中包含适当类别的标题?我想在其中使用它?如果同一个类需要同时使用该类别的两个实现,该怎么办?

另一个相关问题" What happens if two ObjC categories override the same method?"与此完全相同,因为AFNetworking和SDWebImage都将类别添加到同一个类而不是子类。在这种情况下,只使用一个类,并且两个类别似乎存在冲突。

3 个答案:

答案 0 :(得分:8)

重命名似乎不是解决问题的最佳方法,

只需使用:

[cell.imageView setImageWithURL:[NSURL URLWithString:url] placeholderImage:[UIImage imageNamed:@"placeholder"] completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType) {

}];
来自SDWebImage的<{> AFNetworking

答案 1 :(得分:7)

名称冲突确实可以在Objective-C运行时发生...... Apple advises the use of 'prefix' on methods names

预期行为:只有运行时加载的最后一个类别/方法才有效。 哪一个 ? 不好的问题!

我的建议:重命名!

答案 2 :(得分:2)

对于那些希望同时使用SDWebImage和AFNetworking的人来说,这是我的穴居人解决方案,不鼓励使用碰撞方法:

https://gist.github.com/sibljon/5957892

这显然不是未来的证据,如果这些方法的实现在AFNetworking或SDWebImage中发生变化,则很容易破坏。它远非理想的解决方案。换句话说,风险自负!