Как установить Массивы внутренний указатель на определенное положение? PHP/XML

, что означает, что он содержит сильную ссылку на экземпляр RetainCycle

Это не так. У него есть неизвестная ссылка на экземпляр RetainCycle. Это не то же самое, что сильная ссылка.

Но я хочу понять, какой сценарий не будет взаимно освобожден одновременно, и Unowned self становится равным nil. Я просто хочу его завершить .?

В любое время 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] также не всегда является ответом.

37
задан chris 27 April 2009 в 23:03
поделиться

2 ответа

Если ваш массив всегда индексируется последовательно (например, '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);
35
ответ дан 27 November 2019 в 04:55
поделиться

Внутренний указатель массива в основном используется для зацикливания массива в одном скрипте PHP. Я бы не рекомендовал использовать его для перехода со страницы на страницу.

Для этого просто следите за номером страницы и размером страницы (количество элементов на странице). Затем, когда вы загружаете другую страницу, вы можете использовать их, чтобы решить, какие элементы массива показывать. Например:

$pageNum = $_GET["pageNum"];
$pageSize = 10;
$startIndex = ($pageNum - 1) * $pageSize;
$endIndex = ($startIndex + $pageSize) - 1;

(или что-то подобное)

2
ответ дан 27 November 2019 в 04:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: