В цели-C (iPhone), как я управляю памятью '@protocol' ссылок?

Ваш первоначальный код занял 15,5 с на моей машине. Первым шагом оптимизации является сохранение графика и обновление данных xdata и y:

t = linspace (0, 10, 100);
for k = 1:numel(t) 

  y = sin (t(1:k));

  if (k == 1)
    p = plot (t(1:k), y, 'linewidth', 1);
    axis ([0, 10, -1, 1]);
  else
    set (p, "xdata", t(1:k));
    set (p, "ydata", y);
  endif
  fname = sprintf ("img%03i.png", k);
  print ("-dpng", "-r100", fname);
endfor

Это займет 13,1 с на моем компьютере. Далее мы можем использовать getframe:

out_dir = "temp_img";
mkdir (out_dir);
t = linspace (0, 10, 100);
for k = 1:numel(t) 
  y = sin (t(1:k));
  if (k == 1)
    p = plot (t(1:k), y, 'linewidth', 1);
    axis ([0, 10, -1, 1]);
  else
    set (p, "xdata", t(1:k));
    set (p, "ydata", y);
  endif
  fname = fullfile (out_dir, sprintf ("img%03i.png", k));
  imwrite (getframe (gcf).cdata, fname);
endfor
cmd = sprintf ("ffmpeg -framerate 20 -i ./%s/img%%03i.png -vf scale=1080:-1 Example1.mp4", out_dir)
system (cmd)

Это займет 3,7 с даже при запуске ffmpeg.

Имейте в виду, что если вы создаете изображения (я думаю, как ваши вихревые видео), у вас есть Пройдите сюжет

17
задан chris.f.jones 12 May 2009 в 23:42
поделиться

2 ответа

Да, вы можете игнорировать эту ошибку. Объект, объявленный как тип id , может не унаследовать от NSObject (у вас нет для использования библиотек Какао для программирования на Objective-C и там являются другими корневыми классами даже в Какао, например NSProxy ). Поскольку сохранить выпуск , автозапуск ) объявлены в NSObject , компилятор не может знать, что экземпляр, объявленный как тип id , отвечает на эти сообщения. Чтобы обойти это, Какао также определяет протокол NSObject , который отражает API NSObject . Если вы объявите свой протокол как

@protocol MyProtocol <NSObject>
@end

, указывая, что MyProtocol расширяет протокол NSObject , вы будете настроены.

30
ответ дан 30 November 2019 в 11:23
поделиться

Обычно, когда вы объявляете объект как id , он считается "любой" объект (это означает, что Objective-C позволит вам вызвать любой метод из любого класса или протокола на id без предупреждения).

Однако, когда вы объявляете объект как id , значение меняется. В этом случае вы вместо этого говорите: я буду вызывать только методы SomeProtocol для этого объекта.

Метод:

- (void)release;

объявлен в протоколе NSObject , но вы явно заявлено: я буду вызывать только методы MyProtocol . Таким образом, компилятор выдает предупреждение о том, что вы нарушили собственное обещание.

Следовательно, вместо:

id<MyProtocol> reference;

вы должны фактически объявить:

id<MyProtocol, NSObject> reference;

или:

NSObject<MyProtocol> reference;

поскольку NSObject (класс) реализует NSObject (протокол).

или:

id reference;

, что является самым широким из множества: позвольте мне вызвать что-нибудь в этом возражать и никогда не жаловаться.

Вы также можете (как предложил Барри Уорк) включить MyProtocol в протокол NSObject - хотя с точки зрения дизайна вы обычно делаете это только при реализации MyProtocol обязательно означает использование NSObject . Обычно мы делаем это, только если NSObject и MyProtocol связаны наследственно или семантически.


Немного информации о протоколе NSObject :

Все, что вы вызвать сохранение / освобождение / автоматическое освобождение при необходимости реализации этого протокола. Как вы можете сделать вывод из этого: в основном все реализует протокол NSObject (хотя некоторые вещи не являются наследниками базового класса NSObject ).

Еще одно быстрое пояснение: NSObject ( класс) и NSObject (протокол) не являются повторными реализациями одного и того же API. Они разделены следующим образом:

  • NSObject (протокол) реализует все необходимое для обработки / проверки существующего объекта в общем смысле (сохранить / освободить, isEqual, class, responsedsToSelector и т. Д.).

  • NSObject (class) реализует меньше общие методы: построение / уничтожение, интеграция потоков, интеграция сценариев.

Таким образом, в большинстве смыслов протокол является более важным из двух. Помните, что класс включает протокол, поэтому, если вы спускаетесь от NSObject, вы получаете оба.

t происходят от базового класса NSObject ).

Еще одно быстрое пояснение: NSObject (класс) и NSObject (протокол) не являются повторными реализациями тот же API. Они разделены следующим образом:

  • NSObject (протокол) реализует все необходимое для обработки / проверки существующего объекта в общем смысле (сохранить / освободить, isEqual, class, responsedsToSelector и т. Д.).

  • NSObject (class) реализует меньше общие методы: построение / уничтожение, интеграция потоков, интеграция сценариев.

Таким образом, в большинстве смыслов протокол является более важным из двух. Помните, что класс включает протокол, поэтому, если вы спускаетесь от NSObject, вы получаете оба.

t происходят от базового класса NSObject ).

Еще одно быстрое пояснение: NSObject (класс) и NSObject (протокол) не являются повторными реализациями тот же API. Они разделены следующим образом:

  • NSObject (протокол) реализует все необходимое для обработки / проверки существующего объекта в общем смысле (сохранить / освободить, isEqual, class, responsedsToSelector и т. Д.).

  • NSObject (class) реализует меньше общие методы: построение / уничтожение, интеграция потоков, интеграция сценариев.

Таким образом, в большинстве смыслов протокол является более важным из двух. Помните, что класс включает протокол, поэтому, если вы спускаетесь от NSObject, вы получаете оба.

NSObject (класс) и NSObject (протокол) не являются повторными реализациями одного и того же API. Они разделены следующим образом:

  • NSObject (протокол) реализует все необходимое для обработки / проверки существующего объекта в общем смысле (сохранить / освободить, isEqual, class, responsedsToSelector и т. Д.).

  • NSObject (class) реализует меньше общие методы: построение / уничтожение, интеграция потоков, интеграция сценариев.

Таким образом, в большинстве смыслов протокол является более важным из двух. Помните, что класс включает протокол, поэтому, если вы спускаетесь от NSObject, вы получаете оба.

NSObject (класс) и NSObject (протокол) не являются повторными реализациями одного и того же API. Они разделены следующим образом:

  • NSObject (протокол) реализует все необходимое для обработки / проверки существующего объекта в общем смысле (сохранить / освободить, isEqual, class, responsedsToSelector и т. Д.).

  • NSObject (class) реализует меньше общие методы: построение / уничтожение, интеграция потоков, интеграция сценариев.

Таким образом, в большинстве смыслов протокол является более важным из двух. Помните, что класс включает протокол, поэтому, если вы спускаетесь от NSObject, вы получаете оба.

  • NSObject (класс) реализует менее общие методы: построение / уничтожение, интеграция потоков, интеграция сценариев.

  • Таким образом, в большинстве случаев протокол является более важным из двух. Помните, что класс включает протокол, поэтому, если вы спускаетесь от NSObject, вы получаете оба.

  • NSObject (класс) реализует менее общие методы: построение / уничтожение, интеграция потоков, интеграция сценариев.

  • Таким образом, в большинстве случаев протокол является более важным из двух. Помните, что класс включает протокол, поэтому, если вы спускаетесь от NSObject, вы получаете оба.

    13
    ответ дан 30 November 2019 в 11:23
    поделиться