Mac OS X Mavericks
Мне сказали, что проблема была исправлена в Mac OS X 10,9
Оригинал
Я прочитал документацию и не нашел ответа.Он предлагает создавать модули изображения, он требует помещения этого устройства внутрь либо ~/Library/Graphics/Image Units
, либо / Library/Graphics/Image Units
(помещение устройства изображения внутрь Your.app/Contents/Library/Graphics/Image Units
не имеет никакого эффекта).
Есть и другие, не рекомендуемыеКстати, для создания Image Unit, который позволяет распространять cikernels и получать доступ к фильтру из вашего кода.Но это мешает вам создавать неисполняемые фильтры, что приводит к значительному снижению производительности.
Я просмотрел содержимое пакетов приложений, таких как Pixelmator или Acorn, и обнаружил, что они также не используют Image Units.Я надеюсь, что это ошибка, и есть способ распространять единицы изображения в комплекте приложений.
Я ищу решение, которое будет одобрено Mac App Store.
Решение, которое не позволяет использовать неисполняемые фильтры
Из заголовка CIPlugIn: / ** Загружает плагин, указанный его URL.* /
+ (void)loadPlugIn:(NSURL *)url allowNonExecutable:(BOOL)allowNonExecutable
AVAILABLE_MAC_OS_X_VERSION_10_0_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_7;
/** Loads a plug-in specified by its URL.
If allowExecutableCode is NO, filters containing executable code will not be loaded. If YES, any kind of filter will be loaded. */
+ (void)loadPlugIn:(NSURL *)url allowExecutableCode:(BOOL)allowExecutableCode
AVAILABLE_MAC_OS_X_VERSION_10_7_AND_LATER;
Новый метод не указан в официальных документах.Итак, чтобы загрузить пакет, вы просто делаете:
if (floor(NSAppKitVersionNumber) <= NSAppKitVersionNumber10_6)
{
[CIPlugIn loadPlugIn:[[NSBundle mainBundle] URLForResource:@"YourPlugin" withExtension:@"plugin"]
allowNonExecutable:YES];
}
else
{
[CIPlugIn loadPlugIn:[[NSBundle mainBundle] URLForResource:@"YourPlugin" withExtension:@"plugin"]
allowExecutableCode:YES];
}
К сожалению, если вы попытаетесь использовать CIFilter с платформой QuartzCore (например, с CALayer), произойдет сбой из-за переполнения стека.
frame #0: 0x00007fff8b6a5d36 CoreImage`-[CIFilter copyWithZone:] + 12
frame #1: 0x00007fff8b7d1c7e CoreImage`-[CIPlugInStandardFilter _provideFilterCopyWithZone:] + 18
frame #2: 0x00007fff8b6a5d59 CoreImage`-[CIFilter copyWithZone:] + 47
frame #3: 0x00007fff8b7d1c7e CoreImage`-[CIPlugInStandardFilter _provideFilterCopyWithZone:] + 18
frame #4: 0x00007fff8b6a5d59 CoreImage`-[CIFilter copyWithZone:] + 47
frame #5: 0x00007fff8b7d1c7e CoreImage`-[CIPlugInStandardFilter _provideFilterCopyWithZone:] + 18
frame #6: 0x00007fff8b6a5d59 CoreImage`-[CIFilter copyWithZone:] + 47