, что означает, что он содержит сильную ссылку на экземпляр RetainCycle
blockquote>Это не так. У него есть неизвестная ссылка на экземпляр RetainCycle. Это не то же самое, что сильная ссылка.
Но я хочу понять, какой сценарий не будет взаимно освобожден одновременно, и Unowned self становится равным nil. Я просто хочу его завершить .?
blockquote>В любое время
closure
захвачен чем-то за пределамиRetainCycle
, и поэтому переживает своего владельца:var rc: RetainCycle? = RetainCycle() // create an RC let cl = rc?.closure // Hold onto its closure rc = nil // Deallocate the RC cl?() // Access the closure safely, but its reference to `self` is invalid. Crash.
Как правило, закрытие, включающее
unowned self
, должно быть невозможно ссылаться за пределамиself
. Иногда трудно понять, что это правда. Например, вот случай, когда приложение, над которым я работаю, недавно зависло:var completion: (() -> Void)? ... DispatchQueue.main.async { [unowned self] in self.completion() self.completion = nil }
Это нормально, но если
self
освобождается между временем, когда он ставит в очередь блок главной очереди, и временем, когда блок бежит, бум.Кстати, в этом случае правильный ответ будет регулярным, сильным
self
. Мы хотим, чтобы цикл сохранения удерживал этот объект до тех пор, пока не будет запущен его обработчик завершения, после чего блок исчезнет, ссылка наself
исчезнет, иself
будет должным образом освобожден. Так что[weak self]
также не всегда является ответом.
Если ваш массив всегда индексируется последовательно (например, 'page1' всегда с индексом '0'), это довольно просто:
$List = array('page1', 'page2', 'page3', 'page4', 'page5');
$CurrentPage = 3; // 'page4'
while (key($List) !== $CurrentPage) next($List); // Advance until there's a match
Я лично не полагаюсь на автоматическую индексацию, потому что есть всегда есть шанс, что автоматический индекс может измениться. Вам следует рассмотреть возможность явного определения ключей:
$List = array(
'1' => 'page1',
'2' => 'page2',
'3' => 'page3',
);
РЕДАКТИРОВАТЬ: Если вы хотите проверить значения массива (вместо ключей), используйте current ()
:
while (current($List) !== $CurrentPage) next($List);
Внутренний указатель массива в основном используется для зацикливания массива в одном скрипте PHP. Я бы не рекомендовал использовать его для перехода со страницы на страницу.
Для этого просто следите за номером страницы и размером страницы (количество элементов на странице). Затем, когда вы загружаете другую страницу, вы можете использовать их, чтобы решить, какие элементы массива показывать. Например:
$pageNum = $_GET["pageNum"];
$pageSize = 10;
$startIndex = ($pageNum - 1) * $pageSize;
$endIndex = ($startIndex + $pageSize) - 1;
(или что-то подобное)