一文讲明白iOS 开发中Framework 和 Library,动态库与静态库用处区别

490 阅读2分钟

在 iOS 开发中,Framework 和 Library 是两种不同的代码封装方式,而 动态库 和 静态库 则是它们的底层实现形式。以下是详细的区别说明、代码实现及引用方法。


一、Framework 与 Library 的区别

特性FrameworkLibrary
结构Bundle 结构,包含代码、资源、头文件等纯二进制文件(.a 或 .dylib
资源支持支持包含图片、xib、plist 等资源文件仅包含代码和头文件
使用场景动态库或静态库均可封装为 Framework静态库(.a)或动态库(.dylib
依赖管理自动管理依赖和头文件需手动配置头文件路径和链接
Swift 支持完整支持 Swift 模块静态库需额外处理 Swift 兼容性问题

二、动态库与静态库的区别

特性静态库动态库
链接时机编译时完整复制到可执行文件运行时动态加载
应用体积增大可执行文件体积可执行文件体积较小
内存占用每个进程独立占用内存多个进程可共享内存中的同一份代码
更新灵活性需重新编译整个应用可单独替换动态库文件
iOS 限制无特殊限制需签名并嵌入应用(iOS 8+ 支持)

三、代码实现与引用示例

1. Objective-C 静态库(.a)

步骤:

  1. 创建 Cocoa Touch Static Library 项目。

  2. 添加代码:

    // MyOCStaticLib.h
    @interface MyOCStaticLib : NSObject
    + (void)hello;
    @end
    
    // MyOCStaticLib.m
    @implementation MyOCStaticLib
    + (void)hello {
        NSLog(@"Hello from Objective-C Static Library");
    }
    @end
    
  3. 编译生成 libMyOCStaticLib.a 和头文件。

引用:

  • 将 .a 和头文件拖入项目。

  • 配置 Build Settings → Header Search Paths

  • 在代码中使用:

    #import "MyOCStaticLib.h"
    [MyOCStaticLib hello];
    

2. Swift 静态库(通过 Framework)

步骤:

  1. 创建 Cocoa Touch Framework 项目。

  2. 修改 Build Settings → Mach-O Type → Static Library

  3. 添加代码:

    // MySwiftStaticLib.swift
    public class MySwiftStaticLib {
        public static func hello() {
            print("Hello from Swift Static Library")
        }
    }
    

引用:

  • 将生成的 .framework 拖入项目。

  • 在代码中使用:

    import MySwiftStaticLib
    MySwiftStaticLib.hello()
    

3. Objective-C 动态库(Framework)

步骤:

  1. 创建 Cocoa Touch Framework 项目。

  2. 添加代码:

    // MyOCDynamicLib.h
    @interface MyOCDynamicLib : NSObject
    + (void)hello;
    @end
    
    // MyOCDynamicLib.m
    @implementation MyOCDynamicLib
    + (void)hello {
        NSLog(@"Hello from Objective-C Dynamic Library");
    }
    @end
    

引用:

  • 将 .framework 拖入项目。

  • 在 General → Frameworks and Libraries 中添加并勾选 Embed & Sign

  • 在代码中使用:

    #import <MyOCDynamicLib/MyOCDynamicLib.h>
    [MyOCDynamicLib hello];
    

4. Swift 动态库(Framework)

步骤:

  1. 创建 Cocoa Touch Framework 项目。

  2. 添加代码:

    // MySwiftDynamicLib.swift
    public class MySwiftDynamicLib {
        public static func hello() {
            print("Hello from Swift Dynamic Library")
        }
    }
    

引用:

  • 将 .framework 拖入项目。

  • 在 General → Frameworks and Libraries 中添加并勾选 Embed & Sign

  • 在代码中使用:

    import MySwiftDynamicLib
    MySwiftDynamicLib.hello()
    

四、关键注意事项

  1. 动态库必须嵌入(Embed) ,否则运行时会出现 image not found 错误。
  2. Swift 静态库需通过 Framework 形式实现,直接生成 .a 对 Swift 支持不完善。
  3. 访问权限:Swift 中需将类和方法标记为 public
  4. 依赖关系:确保所有依赖的库已正确链接和嵌入。

通过以上示例,可以清晰地区分 Framework 与 Library 的使用场景,并合理选择动态库或静态库。