Подтвердить что ты не робот

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

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

Единственное упоминание о нем в Программе в Objective-C 2.0 от Stephen Kochan:

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

...

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

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

Любая помощь будет потрясающей, спасибо!

4b9b3361

Ответ 1

@package похож на internal для .NET. Это означает, что член доступен только из рамки, в которой он определен.

Примечание. В 32-битном режиме он действует как @public.

Ответ 2

Документация 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, но это не имеет никакого отношения к изображению, поскольку оно относится к исходному вопросу.