Мы недавно выпустили наше приложение в магазин приложений и почти сразу получили несколько сбоев в SDWebImageManager imageDownloader: didFinishWithImage: Верхняя часть стеков выглядит так:
0 libobjc.A.dylib 0x33c28c98 objc_msgSend + 16
1 CoreFoundation 0x308f0571 -[NSObject(NSObject) performSelector:withObject:withObject:] + 25
2 Ourcode 0x0001d98f -SDWebImageManager imageDownloader:didFinishWithImage:
3 CoreFoundation 0x308f0571 -[NSObject(NSObject) performSelector:withObject:withObject:] + 25
4 Ourcode 0x0001cb03 -SDWebImageDownloader connectionDidFinishLoading:
У нас есть последний код SD, который делаетсохранить делегата внутри этой функции.Пока наш делегат создан должным образом, я не вижу, как мы попадаем в эту ситуацию.Мне кажется, что delgate executeSelector on был освобожден.Но SDWebImageManager повторно возвращает делегата.
Соответствующий код для imageDownloader: didFinishWithImage: is:
- (void)imageDownloader:(SDWebImageDownloader *)downloader didFinishWithImage:(UIImage *)image
{
[downloader retain];
SDWebImageOptions options = [[downloader.userInfo objectForKey:@"options"] intValue];
// Notify all the downloadDelegates with this downloader
for (NSInteger idx = (NSInteger)[downloaders count] - 1; idx >= 0; idx--)
{
NSUInteger uidx = (NSUInteger)idx;
SDWebImageDownloader *aDownloader = [downloaders objectAtIndex:uidx];
if (aDownloader == downloader)
{
id<SDWebImageManagerDelegate> delegate = [[[downloadDelegates objectAtIndex:uidx] retain] autorelease];
if (image)
{
if ([delegate respondsToSelector:@selector(webImageManager:didFinishWithImage:)])
{
[delegate performSelector:@selector(webImageManager:didFinishWithImage:) withObject:self withObject:image];
}
}