Две категории в одном классе с одинаковым именем метода

Я заметил, что категории 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. Это далеко не идеальное решение. Иными словами, на свой страх и риск!