我知道ARC和MRC是如何工作的。 但在testing下面的代码时我感到困惑。 我不知道这是为什么发生。 为什么在debugging模式和运行模式下,同一个问题的保留计数是不同的? NSMutableArray *a = [NSMutableArray array]; [a addObject:@"abc"]; NSLog(@" 1 Retain count is %ld", CFGetRetainCount((__bridge CFTypeRef)a)); __weak NSMutableArray *b = a; NSLog(@" 2 Retain count is %ld", CFGetRetainCount((__bridge CFTypeRef)a)); a = nil; NSLog(@" 3 Retain count is %ld", CFGetRetainCount((__bridge CFTypeRef)b)); [b addObject:@"xys"]; NSLog(@" 4 Retain count is %ld", CFGetRetainCount((__bridge CFTypeRef)b)); 当我在运行模式下运行应用程序时,应用程序在NSLog(@" 3 […]
在我的应用程序中,我使用图像加载器类从Web加载图像的集合视图。 该类会跟踪下载操作,并在收集视图中不再显示图像的单元格时将其取消。 这个实现基于NSOperation的raywenderlich教程: http ://www.raywenderlich.com/76341/use-nsoperation-nsoperationqueue-swift。 我使用NSOperation从网上下载图片。 我注意到仪器没有任何NSoperations被释放。 这会增加下载的每个图像的已用内存。 在完成块我引用“自我”。 所以我发现我创造了一个保留周期。 我在互联网上阅读了很多例子。 我知道我可以使用“弱自我”或“无主”的捕获列表。 我尝试了这个完成块,但仍然没有释放操作。 我的图像加载器类的代码如下所示: import Foundation import UIKit class ImageLoader { lazy var downloadsInProgress = [NSIndexPath:NSOperation]() lazy var downloadQueue:NSOperationQueue = { var queue = NSOperationQueue() queue.name = "Image Download queue" return queue }() let cache = NSCache() // contains NSData objects for images init() { […]
我有块要求。 但编译器发出警告 “在这个区块强烈地捕捉”自我“可能会导致一个保留周期” __weak typeof(self) weakSelf = self; [generalInstaImage setImageWithURLRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:data[@"images"][@"low_resolution"][@"url"]]] placeholderImage:[UIImage imageNamed:@"Default"] success:^(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image) { NSLog(@"success"); [generalInstaImage setImage: image]; [weakSelf saveImage:generalInstaImage.image withName:data[@"id"]]; } failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error) { NSLog(@"fail"); }]; 我尝试写例如weakSelf.generalInstaImage示例,但编译器生成一个错误,不编译。
假设我已经创build了一个弱自我使用 __weak typeof(self) weakSelf = self; [self doABlockOperation:^{ … }]; 在那个块里面,如果我嵌套另一个块: [weakSelf doAnotherBlockOperation:^{ [weakSelf doSomething]; } 它会创build一个保留周期吗? 我是否需要为弱者创造另一个弱点? __weak typeof(self) weakerSelf = weakSelf; [weakSelf doAnotherBlockOperation:^{ [weakerSelf doSomething]; }