diff --git a/SDWebImage/UIButton+WebCache.m b/SDWebImage/UIButton+WebCache.m index 7c861e81..11e34b18 100644 --- a/SDWebImage/UIButton+WebCache.m +++ b/SDWebImage/UIButton+WebCache.m @@ -146,18 +146,10 @@ static inline NSString * backgroundImageURLKeyForState(UIControlState state) { completed:completedBlock]; } -- (void)sd_setImageLoadOperation:(id)operation forState:(UIControlState)state { - [self sd_setImageLoadOperation:operation forKey:[NSString stringWithFormat:@"UIButtonImageOperation%@", @(state)]]; -} - - (void)sd_cancelImageLoadForState:(UIControlState)state { [self sd_cancelImageLoadOperationWithKey:[NSString stringWithFormat:@"UIButtonImageOperation%@", @(state)]]; } -- (void)sd_setBackgroundImageLoadOperation:(id)operation forState:(UIControlState)state { - [self sd_setImageLoadOperation:operation forKey:[NSString stringWithFormat:@"UIButtonBackgroundImageOperation%@", @(state)]]; -} - - (void)sd_cancelBackgroundImageLoadForState:(UIControlState)state { [self sd_cancelImageLoadOperationWithKey:[NSString stringWithFormat:@"UIButtonBackgroundImageOperation%@", @(state)]]; } diff --git a/SDWebImage/UIImageView+WebCache.m b/SDWebImage/UIImageView+WebCache.m index 8832f2e4..be289db8 100644 --- a/SDWebImage/UIImageView+WebCache.m +++ b/SDWebImage/UIImageView+WebCache.m @@ -109,18 +109,18 @@ }]; } -static char animationloadOperationKey; +static char animationLoadOperationKey; // element is weak because operation instance is retained by SDWebImageManager's runningOperations property // we should use lock to keep thread-safe because these method may not be acessed from main queue - (NSPointerArray *)sd_animationOperationArray { @synchronized(self) { - NSPointerArray *operationsArray = objc_getAssociatedObject(self, &animationloadOperationKey); + NSPointerArray *operationsArray = objc_getAssociatedObject(self, &animationLoadOperationKey); if (operationsArray) { return operationsArray; } operationsArray = [NSPointerArray weakObjectsPointerArray]; - objc_setAssociatedObject(self, &animationloadOperationKey, operationsArray, OBJC_ASSOCIATION_RETAIN_NONATOMIC); + objc_setAssociatedObject(self, &animationLoadOperationKey, operationsArray, OBJC_ASSOCIATION_RETAIN_NONATOMIC); return operationsArray; } } diff --git a/SDWebImage/UIView+WebCacheOperation.h b/SDWebImage/UIView+WebCacheOperation.h index bef703eb..5d44691f 100644 --- a/SDWebImage/UIView+WebCacheOperation.h +++ b/SDWebImage/UIView+WebCacheOperation.h @@ -12,10 +12,12 @@ #import "SDWebImageManager.h" +// These methods are used to support canceling for UIView image loading, it's designed to be used internal but not external. +// All the stored operations are weak, so it will be dalloced after image loading finished. If you need to store operations, use your own class to keep a strong reference for them. @interface UIView (WebCacheOperation) /** - * Set the image load operation (storage in a UIView based dictionary) + * Set the image load operation (storage in a UIView based weak map table) * * @param operation the operation * @param key key for storing the operation diff --git a/SDWebImage/UIView+WebCacheOperation.m b/SDWebImage/UIView+WebCacheOperation.m index bcdaa3d1..78d58f41 100644 --- a/SDWebImage/UIView+WebCacheOperation.m +++ b/SDWebImage/UIView+WebCacheOperation.m @@ -16,7 +16,7 @@ static char loadOperationKey; // key is copy, value is weak because operation instance is retained by SDWebImageManager's runningOperations property // we should use lock to keep thread-safe because these method may not be acessed from main queue -typedef NSMapTable SDOperationsDictionary; +typedef NSMapTable> SDOperationsDictionary; @implementation UIView (WebCacheOperation) @@ -47,13 +47,13 @@ typedef NSMapTable SDOperationsDictionary; - (void)sd_cancelImageLoadOperationWithKey:(nullable NSString *)key { // Cancel in progress downloader from queue SDOperationsDictionary *operationDictionary = [self sd_operationDictionary]; - id operation; + id operation; @synchronized (self) { operation = [operationDictionary objectForKey:key]; } if (operation) { if ([operation conformsToProtocol:@protocol(SDWebImageOperation)]){ - [(id) operation cancel]; + [operation cancel]; } @synchronized (self) { [operationDictionary removeObjectForKey:key];