У меня возникла проблема с освобождением экземпляров NSObject, когда я не ожидаю. У меня есть переменная формы типа NSNumber, в button1 я создаю экземпляр и устанавливаю значение, в button2 я читаю значение. Если я не назову удержание в кнопке 1, тогда переменная освобождается, и приложение зависает, когда я нажимаю кнопку2, добавление вызова для сохранения заставляет все работать.Delphi XE6 ARC для переменных OSX, освобождающих
Это на OSX, используя Delphi XE6 с firemonkey.
Вот код
Определение формы переменной типа NSNumber
Fv : NSNumber;
Теперь добавьте пару кнопок
для Button1Click
begin
Fv := TNSNumber.Wrap(TNSNumber.OCClass.numberWithFloat(4.0));
ShowMessage(IntToStr(Fv.retainCount)); // value is 1
Fv.retain; // comment out this to make it crash on button2 click
ShowMessage(IntToStr(Fv.retainCount)); // value is 2, or 1 without the retain
end;
для Button2click
Теперь, похоже, что это происходит в конце нажатия кнопки Button1, delphi освобождает Fv, уменьшая счетчик ссылок, то есть он действует как выход из области видимости. Поэтому, чтобы FV зависать, мне нужно добавить Fv.retain. Если я нажму кнопку2 без сохранения, то он сработает.
Должен ли я занять удержание - я не думал, что это необходимо, или я пропускаю что-то еще?
ТИА
То же самое происходит при ориентации на iOS. Когда я обертываю объекты Objective-C, мне иногда приходится вызывать сохранение, а иногда и нет. Не понял, в чем разница, но легко обнаружить, когда требуется сохранение :-) – Hans
Я не знал, что компилятор OS X XE 6 реализовал ARC. Я думал только о iOS и Android? –
FWIW, 'numberWithFloat()' вероятно, генерирует переменную autorelease (большинство «конструкторов удобства»). Они действительно должны быть сохранены, чтобы держать их вокруг дольше, чем до следующего цикла авторекламы. –