title: What's the difference between __weak and __strong attributes in iOS?
body: <p>There is the code in one opensource project:</p>
  
  <pre><code>- (id) initWithContentPath: (NSString *) path parameters: (NSDictionary *) parameters
  {
      NSAssert(path.length &gt; 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:&amp;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;
  }
  </code></pre>
  
  <p>I want to know when one class need to set <code>self</code> to strong or weak?</p>