我注意到 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 类别重写相同的方法会发生什么? https://stackoverflow.com/questions/3221972/what-happens-if-two-objc-categories-override-the-same-method" 与此不太一样,因为 AFNetworking 和 SDWebImage 都将类别添加到同一个类而不是子类上。在这种情况下,仅使用一次类,并且 2 个类别似乎存在冲突。
名称冲突确实是 Objective-C 运行时可能发生的事情......Apple 建议在方法名称上使用“前缀” http://developer.apple.com/library/ios/#documentation/cocoa/conceptual/ProgrammingWithObjectiveC/CustomizingExistingClasses/CustomizingExistingClasses.html.
预期的行为:只有运行时加载的最后一个类别/方法才会有效。
哪一个 ?
不好的问题!
我的建议:重命名!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)