Что делает директива @package в Objective-C?


кто-нибудь точно знает, для чего используется директива @package в Objective-C?

единственное упоминание, которое я мог найти в программировании в Objective-C 2.0 Стивена кочана, было:

@package-для 64-разрядных изображений переменная экземпляра может быть доступна в любом месте изображения, реализующего класс

...

Что? Это ограничено тем, что используется с изображениями, как в картинках? Или это означает изображения, как в образы дисков?

это запутанное описание, и не уточняет ничего на протяжении всей остальной части книги....

любая помощь была бы удивительной, спасибо!

2 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, но это не имеет ничего общего с изображением, как это относится к исходному вопросу.