我认为我很了解强弱关键词,但我不明白它是如何在下面的代码中使用的.此代码来自github上的Olivier Poitrey的SDWebImage.我理解这里描述的强弱关键词:iOS5中强弱存储的解释
下面的代码以对我很好奇的方式使用__weak和__strong关键字.它不是一个孩子 - 父母的关系或委托模式,因为我习惯于看到弱的使用.但是,我确信这是一个经常使用的模式,正如我之前在其他代码中看到的那样.它在另一个线程上运行的块之前设置__weak引用.然后,在块内,它将弱引用设置为强引用.
我确信这个优雅而优雅的代码,所以我试图理解它.如果在块运行之前"self"不再存在,则弱自引用将为零.块运行时,强引用也将设置为零.因此,它将知道杀死剩下的操作,因为自我不再存在.我做对了吗?
现在,如果我们不使用__weak和__strong关键字会发生什么?如果我们只是在块内检查self == nil会怎么样?"自我"永远不会是零,因为块复制整个树?
有人可以帮助揭开这段令人敬畏的代码的神秘面纱吗?有人可以验证或否定我的假设吗?
- (void)setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options progress:(SDWebImageDownloaderProgressBlock)progressBlock completed:(SDWebImageCompletedBlock)completedBlock;
{
[self cancelCurrentImageLoad];
self.image = placeholder;
if (url)
{
__weak UIImageView *wself = self;
id<SDWebImageOperation> operation = [SDWebImageManager.sharedManager downloadWithURL:url options:options progress:progressBlock completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished)
{
__strong UIImageView *sself = wself;
if (!sself) return;
if (image)
{
sself.image = image;
[sself setNeedsLayout];
}
if (completedBlock && finished)
{
completedBlock(image, error, cacheType);
}
}];
objc_setAssociatedObject(self, &operationKey, operation, OBJC_ASSOCIATION_RETAIN_NONATOMIC); …Run Code Online (Sandbox Code Playgroud) iphone ios objective-c-blocks automatic-ref-counting sdwebimage
我想在使用Core Graphics绘图时右对齐多个文本.下面是我现在用于绘制文本的代码.如何绘制几个右对齐的文本?
CGContextSelectFont(context, "Helvetica-Light", 10.0f,kCGEncodingMacRoman);
CGContextSetTextDrawingMode(context, kCGTextFill);
CGContextSetFillColorWithColor(context, _privateColor.CGColor);
CGContextShowTextAtPoint(context, point.x, point.y, [text cStringUsingEncoding:NSUTF8StringEncoding], text.length);
Run Code Online (Sandbox Code Playgroud) 我和MagicalRecord有一个奇怪的问题.删除不会持久.当我删除时,NSFetchedResultsControllerDelegate正确地看到该对象已被删除.但是,如果我关闭并重新打开应用程序,则实体会重新出现.
我用来删除实体的代码是:
ActivityType *activityType = [_fetchedResultsController objectAtIndexPath:indexPath];
[activityType deleteInContext:[NSManagedObjectContext MR_defaultContext]];
[[NSManagedObjectContext MR_defaultContext] MR_saveToPersistentStoreAndWait];
Run Code Online (Sandbox Code Playgroud)
我用来设置NSFetchedResultsController的代码是:
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription
entityForName:@"ActivityType" inManagedObjectContext:[NSManagedObjectContext defaultContext]];
[fetchRequest setEntity:entity];
NSSortDescriptor *sort = [[NSSortDescriptor alloc]
initWithKey:@"name" ascending:YES];
[fetchRequest setSortDescriptors:[NSArray arrayWithObject:sort]];
NSFetchedResultsController *theFetchedResultsController =
[[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest
managedObjectContext:[NSManagedObjectContext defaultContext] sectionNameKeyPath:nil
cacheName:@"activityTypes"];
_fetchedResultsController = theFetchedResultsController;
_fetchedResultsController.delegate = self;
Run Code Online (Sandbox Code Playgroud)
基于其他SO帖子,我也尝试[NSManagedObjectContext rootSavingContext]在设置和删除中使用(但无济于事).