【问题标题】:What's the difference between __weak and __strong attributes in iOS?iOS 中的 __weak 和 __strong 属性有什么区别?
【发布时间】:2013-02-01 02:17:47
【问题描述】:

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

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

【问题讨论】:

  • 我认为代码实际上并不正确。由于没有保留块,因此无需使用weakSelf
  • @CarlVeazey 项目在github.com/kolyvan/kxmovie,运行良好,但复制(合并)代码到其他项目时无法运行
  • 理解强与弱是 Objective-C 中一个非常重要的概念,并且通常在任何课程/书籍的早期都涉及到。如果您的问题是针对代码的(“我理解强弱,但我不明白它是如何在此代码中使用的”),请重新措辞以明确这一点。如果您正在寻找一般的理解,我建议您阅读 Objective-C 参考,因为它对您未来的所有代码都很重要。此外,该问题已在此处讨论:stackoverflow.com/questions/9262535/…

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


【解决方案1】:

strong 引用用于确保您引用的对象在您仍在使用时不会被释放。 weak 当你不关心你引用的对象是否被释放时,使用一个 weak 引用。当没有对该对象的强引用时,弱引用会自动设置为 nil

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

【讨论】:

  • +1 需要注意的是:如果您在 iOS 4.x 或 OS X 10.6 上使用 ARC,弱引用设置为 nil。在这些系统上,它们的行为与 assign 完全一样,您可以在其中留下悬空指针。
【解决方案2】:

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 2012-07-31
    • 1970-01-01
    • 2016-04-29
    • 2011-11-14
    • 1970-01-01
    相关资源
    最近更新 更多