Ответ 1
@package
похож на internal
для .NET. Это означает, что член доступен только из рамки, в которой он определен.
Примечание. В 32-битном режиме он действует как @public
.
Кто-нибудь знает, для чего используется директива @package в Objective-C?
Единственное упоминание о нем в Программе в Objective-C 2.0 от Stephen Kochan:
@package - для 64-битных изображений переменную экземпляра можно получить в любом месте изображения, которое реализует класс
...
Что? Это ограничение используется для изображений, как на фотографиях? Или это означает изображения, как в образах дисков?
Это запутанное описание, и не уточняет, что в остальной части книги....
Любая помощь будет потрясающей, спасибо!
@package
похож на internal
для .NET. Это означает, что член доступен только из рамки, в которой он определен.
Примечание. В 32-битном режиме он действует как @public
.
Документация Apple объясняет это немного, но здесь немного подробнее...
Переменные экземпляра, объявленные в @package
, будут доступны только с помощью кода из той же структуры, библиотеки или исполняемого файла. Это наиболее похоже на internal
в С# и Friend
в 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". Вы также найдете использование словарного изображения, разбросанного по всей документации для dyld
. Чтение страницы руководства для dyld
могло бы помочь немного устранить двусмысленность этого слова. UIImage
может объявлять переменные как @package
, но это не имеет никакого отношения к изображению, поскольку оно относится к исходному вопросу.