Objective-c类扩展在静态库中无效

Jer*_*vid 3 extension-methods objective-c

在创建一个将在几个项目中使用的库时,我遇到了一个我自己无法解决的错误.

该库由几个"模块"组成,每个模块都声明了它的一组类.模块声明了引用类的头文件.每个模块头都包含在库头中,并且所有模块头都被复制到库目标中.

"GMData"模块定义了库的ORM层,它声明了一个"GMInitializerBase"类,其目的是初始化模块.它必须在UIApplicationDelegate中调用一次.

"GMModel"模块包含应用程序的基本模型(Categories,Articles,...),它必须将自身注册到"GMData"才能正常运行.

结构体:

<Library Root>
    Library.h
    <GMData>
        GMData.h
        GMInitializerBase.{h,m}
    <GMModel>
        GMModel.h
        GMInitializerBase+GMModel.{h,m}
Run Code Online (Sandbox Code Playgroud)

Library.h的内容

#import "GMData.h"
#import "GMModel.h"
Run Code Online (Sandbox Code Playgroud)

GMData.h的内容

#import "... ORM related headers ..."
#import "GMInitializerBase.h"
Run Code Online (Sandbox Code Playgroud)

GMInitializerBase的内容.{h,m}

#import "... ORM Classes ..."

@interface GMInitializerBase : NSObject {

}

+ (void) bootstrap;
+ (GMInitializerBase*) initializer; // autoreleased instance creator

- (void) setup;
- (void) setupStore:(GMManagerFactory*)factory; // Setup database connection
- (void) setupHelpers:(GMHelperFactory*)factory; // Register helpers (abstract)
- (void) setupManagers:(GMManagerFactory*)factory; // Register managers (abstract)

@end

@implementation GMInitializerBase

+ (void) bootstrap {
    GMInitializerBase* initializer = [self initializer];

    [initializer setup];
}

- (void) setup {
    /* Breakpoint 01 */
    GMHelperFactory* helperFactory = [GMHelperFactory sharedInstance];
    GMManagerFactory* managerFactory = [GMManagerFactory sharedInstance];

    [self setupStore:managerFactory];
    [self setupHelpers:helperFactory];
    [self setupManagers:managerFactory];
}

@end
Run Code Online (Sandbox Code Playgroud)

GMModel.h的内容

#import "... Base Models files ..."
#import "GMInitializerBase+GMModel.h"
Run Code Online (Sandbox Code Playgroud)

GMInitializerBase + GMModel的内容.{h,m}

@interface GMInitializerBase (GMModel_Additions)

- (void) setup;
- (void) setupGMModelHelpers:(GMHelperFactory*)factory;
- (void) setupGMModelManagers:(GMManagerFactory*)factory;

@end

@implementation GMInitializerBase (GMModel_Additions)

- (void) setup {
    /* Breakpoint 02 */
    GMHelperFactory* helperFactory = [GMHelperFactory sharedInstance];
    GMManagerFactory* managerFactory = [GMManagerFactory sharedInstance];

    // parent implementation
    [self setupStore:managerFactory];

    // current implementation
    [self setupGMModelHelpers:helperFactory];
    [self setupGMModelManagers:managerFactory];

    // parent implementation
    [self setupHelpers:helperFactory];
    [self setupManagers:managerFactory];
}

- (void) setupGMModelHelpers:(GMHelperFactory*)factory { /* ... */ }
- (void) setupGMModelManagers:(GMManagerFactory*)factory { /* ... */ }

@end
Run Code Online (Sandbox Code Playgroud)

ProjectAppDelegate.m的内容(位于另一个项目中,它包含library.a并搜索"Headers"目录)

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    [[GMInitializerBase initializer] setup];
}
Run Code Online (Sandbox Code Playgroud)

在第一个断点处停止(断点01)它在库中时崩溃:

  • 我宣布一个加法而没有重载方法;
  • 我宣布添加一个Cocoa类([NSString toto])而不重载;

在测试项目中的工作:

  • 我宣布添加一个Cocoa类([NSString toto])而不重载;

我没有尝试重载库类,但我认为它也可以工作.

我的问题如下:我无法获得额外的工作,我需要它.

感谢您的阅读,感谢您的回答.

Sha*_*ver 9

确保在项目设置中的"Other Linker Flags"中设置了-all_load和-ObjC标志.没有它们,库中的类别将无法运行.