4

在一个开源项目中有代码:

- (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为强或弱?

4

2 回答 2

5

当您想要确保您所引用的对象在您仍在使用它时不会被释放时,使用强引用。当您不关心您引用的对象是否被释放时,使用弱引用。nil当没有对该对象的强引用时,会自动设置弱引用。

基本上,只要至少有一个对象的强引用,它就不会被释放。当没有更多的强引用时,所有弱引用(如果有)都设置为nil.

于 2013-02-01T03:29:50.417 回答
1

如果您正在寻找对您发布的代码的清晰解释,我可以尝试提供帮助。我发布了一个类似的问题,并对正在发生的事情进行了假设,并等待答案来验证或使我的假设无效。

我的问题在这里:解释 SDWebImage 代码中的 __weak 和 __strong 使用原因

总结一下,我的想法是:这段代码正在初始化一个类的实例。但它需要运行一个异步块。__weak 和 __strong 关键字用于确保实例在异步块运行时仍然有效。如果实例已被释放,则无需执行“setMovieDecoder”操作。

要回答您的特定问题,您希望在运行需要更新某些对象实例的异步块并且需要该实例来更新它时使用此 Code Pattern。不要在只是下载诸如同步引擎之类的东西的异步块周围使用此 Code Pattern。

**** 免责声明:检查我提炼的问题的答案,以期获得对我上面描述的代码模式的真正专家解释。希望我是对的。

于 2013-02-16T07:49:11.943 回答