Две категории в одном классе с одинаковым именем метода
Я заметил, что категории AFNetworking и SDWebImage в UIImageView имеют одинаковое имя метода.
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 и наоборот.
какое поведение я могу ожидать где? Должен ли я включать заголовок только для соответствующей категории В класс, в котором я хотел бы его использовать? Что если же class должен использовать обе реализации категории?
еще один связанный с этим вопрос"что произойдет, если две категории ObjC переопределяют один и тот же метод? " не совсем то же самое, потому что AFNetworking и SDWebImage добавляют категории в один и тот же класс, а не подкласс. В этом случае используется только один класс, и 2 категории, похоже, находятся в конфликте.
3 ответов
столкновение имен действительно может произойти во время выполнения Objective-C... Apple советует использовать "префикс" для имен методов.
ожидаемое поведение: будет действовать только последняя категория/метод, загруженный средой выполнения. Что это ? Плохой вопрос !
мой совет : переименовать !
переименование не кажется лучшим способом решить проблему,
просто использовать :
[cell.imageView setImageWithURL:[NSURL URLWithString:url] placeholderImage:[UIImage imageNamed:@"placeholder"] completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType) {
}];
С SDWebImage
который не существует в AFNetworking
для тех, кто хочет использовать SDWebImage и AFNetworking как есть, вот мое решение пещерного человека, чтобы препятствовать использованию методов столкновения:
https://gist.github.com/sibljon/5957892
Это, очевидно, не будущее доказательство, и склонен к нарушению, если реализация этих методов изменяется в AFNetworking или SDWebImage. Это далеко не идеальное решение. Иными словами, на свой страх и риск!