iOS中的__weak和__strong属性有什么区别?

时间:2013-02-01 02:17:47

标签: objective-c ios6 weak-references strong-references

一个开源项目中有代码:

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

2 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:1)

如果您正在寻找对所发布代码的明确解释,我可以尝试帮助解决这个问题。我发布了一个类似的问题,假设发生了什么,并等待答案来验证或使我的假设无效。

我的问题在这里:Explain __weak and __strong usage reasons in SDWebImage code

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

要回答您的具体问题,您希望在运行需要更新某个对象实例的异步块时使用此代码模式,并且需要该实例来更新它。不要在简单下载诸如同步引擎之类的异步块周围使用此代码模式。

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