有一个开源项目中的代码:
- (id) initWithContentPath: (NSString *) path parameters: (NSDictionary *) parameters
{
NSAssert(path.length > 0, @"empty path");
playPath = path;
self = [super initWithNibName:nil bundle:nil];
if (self) {
_moviePosition = 0;
_startTime = -1;
self.wantsFullScreenLayout = YES;
_decodeDuration = DEFAULT_DECODE_DURATION;
_minBufferedDuration = LOCAL_BUFFERED_DURATION;
_parameters = parameters;
__weak KxMovieViewController *weakSelf = self;
dispatch_async(dispatch_get_global_queue(0, 0), ^{
NSError *error;
KxMovieDecoder *decoder;
decoder = [KxMovieDecoder movieDecoderWithContentPath:path error:&error];
NSLog(@"KxMovie load video %@", path);
__strong KxMovieViewController *strongSelf = weakSelf;
if (strongSelf) {
dispatch_sync(dispatch_get_main_queue(), ^{
[strongSelf setMovieDecoder:decoder withError:error];
});
}
});
}
return self;
}
我想知道什么时候一个班级需要将self
设置为强或弱?
当您想要确保所引用的对象在您仍在使用时不会释放它时,将使用强引用。当您不关心所引用的对象是否已解除分配时,将使用弱引用。弱引用将自动设置为 nil
当不再有对该对象的强引用时。
基本上,只要至少有一个对对象的强引用,它就不会被解除分配。当没有更多的强引用时,所有弱引用(如果有)都设置为 nil
。
如果您正在寻找对您发布的代码的清晰解释,我可以尝试提供帮助。我发布了一个类似的问题,其中包含关于正在发生的事情的假设,并等待答案来验证或否定我的假设。
我的问题是:解释SDWebImage代码中的__weak和__strong使用原因
综上所述,以下是我的想法:此代码正在初始化类的实例。但它需要运行一个异步块。__weak 和 __strong 关键字用于确保实例在异步块运行时仍然有效。如果实例已解除分配,则无需执行"setMovieDecoder"操作。
为了回答您的特定问题,每当运行需要更新某个对象实例的异步块并且需要该实例来更新它时,您都希望使用此代码模式。不要在异步块周围使用此代码模式,这些块只是下载同步引擎等内容。
免责声明:查看我改进问题的答案,希望能对我上面描述的代码模式有一个真正的专家解释。希望我是对的。