основной класс NSBundle

Пожалуйста, помогите мне понять, для чего используется PrincipalClass? Каков его синтаксис. Я понимаю, что это в классе NSBundle, но можем ли мы создать его для любых пакетов или он специфичен только для лаодируемых пакетов? Пожалуйста, помогите мне узнать концепцию PrincipalClass.

Благодарю Тебя.


person suse    schedule 28.12.2009    source источник


Ответы (3)


Я приведу вам пример того, как вы можете создать и загрузить пакет в качестве плагина. Надеюсь, что это вам очень поможет. Я должен сказать, что согласен с двумя другими (пока) ответами. Так...

Создайте проект Xcode как "Bundle" (в Xcode 3.2.6 в New Project->Framework & Library-> выберите "Bundle"). Создайте следующие файлы...

PКласс.h

#import <Foundation/Foundation.h>
@interface PClass : NSObject {

}

- (NSString*) stringMessage;

@end

PКласс.м

- (NSString*) stringMessage {
    return @"Hallo from plugin";
}

в файле проектов .plist добавьте следующие две записи:

"Отображаемое имя пакета" "MyPlugin"

"Основной класс" "PClass"

Затем скомпилируйте проект и переместите двоичный файл (.../build/Debug/yourPlugin.bundle) в папку, в которой вы хотите хранить плагины вашего проекта (можно скопировать в aProject.app/Plugins/ с небольшим дополнением). забота).

Затем к уже имеющемуся проекту Xcode добавьте следующее:

- (void) loadPlugin {

    id bundle = [NSBundle bundleWithPath:@"the path you/placed/yourPlugin.bundle"];

    NSLog(@"%@", [[bundle infoDictionary] valueForKey:@"CFBundleDisplayName"]);
    // Here you can preview your plugins names without loading them if you don't need to or just to
    // display it to GUI, etc

    NSError *err;
    if(![bundle loadAndReturnError:&err]) {
        // err 
    } else {
        // bundle loaded
        Class PluginClass = [bundle principalClass]; // here is where you need your principal class!
        // OR...
        //Class someClass = [bundle classNamed:@"KillerAppController"];

        id instance = [[PluginClass alloc] init];

        NSLog(@"%@", [instance stringMessage]);

        [instance release];  // If required
    [bundle unload]; // If required
}

}

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

person Vassilis    schedule 01.06.2011

«Основной класс» пакета — это просто класс Objective-C, который помечен как основной класс пакета и, таким образом, будет возвращен методом -principalClass экземпляра пакета.

Ни больше, ни меньше и никакой магии.

Он существует только для загружаемых пакетов, потому что только загружаемые пакеты определяют новые классы Objective-C.

person bbum    schedule 28.12.2009
comment
Спасибо .. можете ли вы дать мне ссылки на любой проект с открытым исходным кодом, который использовал в нем основной класс. - person suse; 29.12.2009

PrincipalClass позволяет вам узнать, какой класс следует использовать после загрузки пакета. Например, предположим, что вы используете пакеты для представления плагинов для приложения для обработки изображений. Когда вы указываете среде выполнения Objective-C загрузить пакет «CSISharpener.bundle», он загрузит в память кучу новых классов. Однако вам все равно нужно знать имя класса для отправки сообщений, чтобы фактически использовать подключаемый модуль.

В нашем примере PrincipalClass может возвращать CSISharpeningFilter, который соответствует протоколу подключаемого модуля, который мы сказали использовать разработчикам подключаемого модуля. Таким образом, мы можем создать экземпляр «principalClass» и начать его использовать, не зная заранее, каково имя класса.

Другими словами, PrincipalClass предназначен для того, чтобы программы, загружающие пакеты, могли легко найти «точку входа» в только что загруженный код. То, для чего именно он используется, будет зависеть от того, какой код загружает пакет и для чего он его использует.

person benzado    schedule 09.01.2010