15

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

AF网络:

- (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 方法,反之亦然。

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

另一个相关问题“如果两个 ObjC 类别覆盖相同的方法会发生什么? ”与此不完全相同,因为 AFNetworking 和 SDWebImage 都将类别添加到同一个类而不是子类中。在这种情况下,仅使用一次类,并且 2 个类别似乎存在冲突。

4

3 回答 3

8

在 Objective-C 运行时中确实会发生名称冲突…… Apple 建议在方法名称上使用“前缀”

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

我的建议:重命名!

于 2013-02-06T04:06:32.183 回答
8

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

只需使用:

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

}];

从中SDWebImage不存在AFNetworking

于 2013-03-08T12:04:56.980 回答
2

对于希望按原样使用 SDWebImage 和 AFNetworking 的任何人,这是我的穴居人解决方案,以阻止使用碰撞方法:

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

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

于 2013-07-09T14:48:52.647 回答