Что делает директива @package в Objective-C?
кто-нибудь точно знает, для чего используется директива @package в Objective-C?
единственное упоминание, которое я мог найти в программировании в Objective-C 2.0 Стивена кочана, было:
@package-для 64-разрядных изображений переменная экземпляра может быть доступна в любом месте изображения, реализующего класс
...
Что? Это ограничено тем, что используется с изображениями, как в картинках? Или это означает изображения, как в образы дисков?
это запутанное описание, и не уточняет ничего на протяжении всей остальной части книги....
любая помощь была бы удивительной, спасибо!
2 ответа:
@package
похож наinternal
for. NET. это означает, что элемент доступен только из фреймворка, в котором он определен.Примечание: в 32-битном он действует как
@public
.
документация Apple объясняет это немного, но вот немного подробнее...
переменные, объявленные в разделе
@package
будет доступен только код из той же платформы, библиотеки или исполняемого файла. Это наиболее похоже наinternal
В C# иFriend
in VB.NET, но другие языки программирования также имеют аналогичные схемы защиты (Java имеетpackage-private
).например, представьте себе рамки,
RecipeKit.framework
, для управления рецепты:@interface Recipe : NSObject { @package; NSString *name; @private; NSArray *ingredients; } @end @interface RecipeController : NSObject @end
контроллер рецептов сможет получить доступ к именам рецептов напрямую. Вы могли бы написать что-то вроде этого в
RecipeController
так это часть той же структуры:Recipe *recipe = [[[Recipe alloc] init] autorelease]; [recipe->name autorelease]; recipe->name = [@"The best ever recipe!" retain];
если бы вы написали приведенный выше код в приложении, связанном с
RecipeKit
, однако, это вызовет ошибку компилятора, так как у вас нет доступа к этой переменной. Наконец, при компиляции для 32-разрядных переменных, объявленных под@package
ведут себя так, как если бы они были объявлено под@public
вместо этого, так что следите за различиями здесь.эта новая функция получила очень мало внимания, потому что это еще один способ сломать инкапсуляцию класса. Как всегда было верно, вы, вероятно, лучше работать с
@private
переменных и методов доступа к ним. Фактически, некоторое время Apple пыталась подтолкнуть это, включив@private
в их шаблоны. Со свойствами в Objective-C 2.0, придерживаясь@private
легко достаточно, и в зависимости от того, на какую платформу вы нацелены, вы можете полностью исключите переменные экземпляров.
изображения
одна вещь, которую несколько предыдущих ответов оставили немного неясным, касалась аспекта изображений из исходного вопроса. На самом деле, слово изображение используется в описании
@package
переменные не имеют ничего общего с графическими изображениями. Вместо этого он ссылается на изображения, которые динамический компоновщик может нагрузка. Обычно исполняемые файлы, фреймворки и динамические библиотеки рассматриваются компоновщиком как образы (хотя они обрабатываются несколько иначе). Вы увидите, что изображение слова всплывает каждый раз и время. Например, распространенная ошибка выполнения: "dyld image not found". Вы также найдете использование изображения word, разбросанного по всей документации дляdyld
. Чтение через man-страницу дляdyld
может помочь немного прояснить двусмысленность этого слова.UIImage
может объявлять переменные как@package
, но это не имеет ничего общего с изображением, как это относится к исходному вопросу.