2013-02-01 30 views
3

您好是一个开源项目的代码:iOS中__weak和__strong attibutes之间的区别是什么?

- (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

我不认为代码实际上是正确的。由于没有保留块,所以不需要使用'weakSelf'。 –

+0

@CarlVeazey该项目位于https://github.com/kolyvan/kxmovie,它运行良好,但在将代码复制(合并)到其他项目时无法工作 – why

+4

理解强与弱是目标中相当重要的概念-C以及在任何课程/书籍中很早就涵盖的内容。如果你的问题是特定于代码的(“我理解强,弱,但我不明白它是如何用在这个代码中的)”,请重新表述清楚。如果你在寻找一般的理解,我会建议阅读一个Objective-C的参考文献,因为它对你所有未来的代码都很重要。此外,这个问题已经在这里介绍:http://stackoverflow.com/questions/9262535/explanation-of-strong-and-weak-storage-in-ios5 –

回答

4

A 参考用于确保您所引用的对象在您仍在使用时未被释放的情况。 A 当您不关心您所引用的对象是否被释放时,使用引用。当没有更强的引用时,弱引用自动设置为nil

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

+0

+1与警告:弱引用是*不*设置如果您在iOS 4.x或OS X 10.6上使用ARC,则为'nil'。在这些系统中,它们的行为与'assign'完全相同,在那里你可以留下悬挂指针。 –

1

如果你正在寻找你发布的代码的明确解释,我可以试着帮忙。我发布了一个类似的问题,并提供了关于正在发生的事情的假设,并等待答案来验证或使我的假设失效。

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

综上所述,这里就是我想:这个代码初始化类的一个实例。但它需要运行一个异步块。 __weak和__strong关键字用于确保在异步块运行时实例仍然有效。如果实例已被释放,则不需要执行“setMovieDecoder”动作。

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

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

相关问题