У меня есть яблочный скрипт, над которым я работал на прошлой неделе или около того. Я запускал и перезапускал скрипт, исправлял ошибки и т. Д., Которые глубоко в коде. Иногда выполнение сценария может занять очень много времени на определенном этапе или даже приводит к тому, что редактор сценария перестает отвечать на запросы. В этих случаях я заставлял редактор выходить из него и запускал его обратно, чтобы добавить некоторые отладочные операторы или попробовать хитрость, чтобы сделать это быстрее.
Что ж, в какой-то момент сегодня я попытался запустить сценарий после принудительного завершения, и он начал случайным образом зависать в цикле в верхней части сценария, к которому я не прикасался в течение нескольких недель. Все, что делает цикл - это повторяет список и добавляет значения в строку - просто. Тем не менее, он каждый раз зависает в этом цикле каждый раз, когда я пытаюсь запустить его. Он будет зависать на той же итерации цикла (например, на итерации 2446), если я не отредактирую код - но если я отредактирую и перезапущу, он зависнет в другом месте. Когда я добавил диалог к определенной итерации, где я думал, что он постоянно зависает, он прошел весь цикл без зависаний. Я удалил диалог, и он снова завис на другой итерации ...?! Нет никакой причины, по которой я могу понять, почему она должна висеть в этой точке в начале сценария. Я попытался перезагрузить компьютер,
Я скачал "Script Debugger 5" и попытался запустить скрипт из него ... больше не зависает! Итак, я начинаю думать, что что-то случилось с редактором Applescript - возможно, из-за моих принудительных выходов?
- Правильна ли моя интуиция - что редактор как-то поврежден?
- Если редактор поврежден, как мне его починить?
Вот цикл (он первый), который висит на итерации случайного цикла. Над ним очень мало кода, который прост и не изменился за месяцы.
tell application "Contacts"
try
--with timeout of 5 seconds
set myEmails to value of first email of every person
set allemailsstr to ""
set myPhones to value of first phone of every person
set allphonesstr to ""
repeat with m from 1 to count of myEmails
if (item m of myEmails as string) is not "missing value" then
tell application "ASObjC Runner"
--with timeout of 1 second
set properties of progress window to {detail:"Collecting Email " & m & " of " & (count of myEmails) & " and Phone 0 of " & (count of myPhones)}
--end timeout
end tell
set allemailsstr to allemailsstr & item m of myEmails & "
"
end if
end repeat
repeat with m from 1 to count of myPhones
if (item m of myPhones as string) is not "missing value" then
tell application "ASObjC Runner"
with timeout of 1 second
set properties of progress window to {detail:"Collecting Email " & (count of myEmails) & " of " & (count of myEmails) & " and Phone " & m & " of " & (count of myPhones)}
end timeout
end tell
set allphonesstr to allphonesstr & item m of myPhones & "
"
end if
end repeat
--set the clipboard to allemailsstr
--end timeout
on error errStr
display dialog "Encountered a timeout while simply adding people to a list"
end try
end tell
Я могу опубликовать приведенный выше код, если потребуется, но, как я уже сказал, это действительно просто - только некоторые объявления переменных, настройка индикатора выполнения графического интерфейса и пара диалоговых окон. Количество повторяющихся контактов превышает 8K.
К вашему сведению, закомментированный код тайм-аута не уловил зависания. Когда происходят зависания, редактор не отвечает. Это долгосрочный сценарий, измеренный в часах.
ОБНОВЛЕНИЕ : я больше не думаю, что редактор Applescript как-то поврежден. Я подозреваю, что это может быть какой-то предел памяти (или какой-то другой предел). Вот почему Когда я запускаю один и тот же сценарий в Applescript Editor на другом компьютере (на моем рабочем компьютере), я все равно зависаю. Скрипт отладчика все равно не зависает.
источник