Блокирует и сохраняет циклы

Один небольшой вопрос :, почему Xcode жалуется, что listing 1приведет к циклу сохранения, а в listing 2этого не происходит? В обоих случаях _clientsявляется переменной экземпляра int. В listing 2ему присваивается 0в методе init.

Справочная информация :Я хотел бы выполнить цикл в блоке, если хотя бы один клиент запрашивает обновления с акселерометра iPhone, которые я публикую на канале Redis. Если больше не останется клиентов, цикл завершится и перестанет публиковать данные акселерометра.

Listing 2исходит из небольшого тестового приложения, которое я написал, чтобы убедиться, что моя идея работает. Listing 1реализован в реальном проекте.

Листинг 1

- (id)init {
  self = [super init];

  if (self) {
    _clients = 0;

    /**
     * The callback being executed
     */
    _callback = ^ {
      while (_clients > 0) { // Capturing 'self' strongly in this block is likely to lead to a retain cycle
        NSLog(@"Publish accelerometer data to redis (connected clients: %d)", _clients);
      }
    };
  }

  return self;
}

Листинг 2

- (void)touchedConnectButton:(id)sender {
  _clients += 1;

  dispatch_queue_t concurrentQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
  dispatch_async(concurrentQueue, ^() {
    while(_clients > 0) {
      NSLog(@"Connected clients: %d", _clients);
    }
  });
}
6
задан mAu 11 July 2012 в 08:48
поделиться