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

Pau*_*III 14 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
{
...
}
Run Code Online (Sandbox Code Playgroud)

和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];
}

...
Run Code Online (Sandbox Code Playgroud)

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

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

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

小智 8

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

只需使用:

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

}];
Run Code Online (Sandbox Code Playgroud)

从中SDWebImage不存在AFNetworking


Vin*_*zzz 7

名称冲突确实可以在Objective-C运行时发生... Apple建议在方法名称上使用'prefix'.

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

我的建议:重命名!

  • 标头对此行为没有任何影响;如果正在编译实现文件,则会发生冲突,并且运行时的加载顺序是不确定的(尽管可能是可重复的)。 (2认同)