在同一类两个类别,有相同的方法名(Two Categories on the same Class

2019-08-16 18:53发布

我注意到上的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中,当我命令点击它重定向我到AFNetworking方法和反之亦然SDWebImage方法。

其行为我可以期待在哪里? 我应该只包括我想用它在一个类中的相应类别的头? 如果同一类需要使用类的两种实现?

另一个相关的问题:“ 如果两个ObjC类覆盖同样的方法,会发生什么? ”是不太一样的,是因为AFNetworking和SDWebImage都被添加到类别相同类别不是一个子类别。 在这种情况下,只有当阶级正在使用和2类似乎是相互冲突的。

Answer 1:

名称冲突确实的东西,可以在Objective-C运行时发生...... 苹果公司建议在方法名称中使用“前缀”的 。

预期的行为:在运行时加载只有最后一类/方法是有效的。 哪一个 ? 坏的问题!

我的建议是:重命名!



Answer 2:

重命名似乎并没有成为解决这个问题的最好办法,

只需使用:

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

}];

SDWebImage不中不存在AFNetworking



Answer 3:

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

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

这显然不是面向未来,并很容易出现断裂,如果这些方法的实施AFNetworking或SDWebImage变化。 这远非一个理想的解决方案。 换句话说,风险自负!



文章来源: Two Categories on the same Class with the same method name