您的位置:首页 > 移动开发 > IOS开发

WWDC2014之iOS使用动态库1

2015-06-12 14:44 381 查看


苹果的开放态度

WWDC2014上发布的
Xcode6
beta
版有了不少更新,其中令我惊讶的一个是苹果在iOS上开放了动态库,在
Xcode6
Beta
版的更新文档中是这样描述的:

Frameworks for iOS. iOS developers can now create dynamic frameworks. Frameworks are a collection of code and resources to encapsulate functionality that is valuable across multiple projects. Frameworks work perfectly with extensions, sharing logic that can
be used by both the main application, and the bundled extensions.

详情见官方文档New Features in Xcode 6 Beta

framework是Cocoa/Cocoa Touch程序中使用的一种资源打包方式,可以将将代码文件、头文件、资源文件、说明文档等集中在一起,方便开发者使用,作为一名Cocoa/Cocoa Touch程序员每天都要跟各种各样的Framework打交道。Cocoa/Cocoa Touch开发框架本身提供了大量的Framework,比如Foundation.framework/UIKit.framework/AppKit.framework等。需要注意的是,这些framework无一例外都是动态库。

但残忍的是,Cocoa Touch上并不允许我们使用自己创建的framework。不过由于framework是一种优秀的资源打包方式,拥有无穷智慧的程序员们便想出了以framework的形式打包静态库的招数,因此我们平时看到的第三方发布的framework无一例外都是静态库,真正的动态库是上不了AppStore的。

WWDC2014给我的一个很大感触是苹果对iOS的开放态度:允许使用动态库、允许第三方键盘、
App
Extension
等等,这些在之前是想都不敢想的事。


iOS上动态库可以做什么

和静态库在编译时和app代码链接并打进同一个二进制包中不同,动态库可以在运行时手动加载,这样就可以做很多事情,比如:

共享可执行文件

在其它大部分平台上,动态库都可以用于不同应用间共享,这就大大节省了内存。从目前来看,iOS仍然不允许进程间共享动态库,即iOS上的动态库只能是私有的,因为我们仍然不能将动态库文件放置在除了自身沙盒以外的其它任何地方。

不过iOS8上开放了
App
Extension
功能,可以为一个应用创建插件,这样主app和插件之间共享动态库还是可行的。

2014-6-23修正:

@唐巧_boy提醒,sandbox会验证动态库的签名,所以如果是动态从服务器更新的动态库,是签名不了的,因此应用插件化、软件版本实时模块升级等功能在iOS上无法实现。


创建动态库


1、创建动态库

创建工程文件

在下图所示界面能够找到Cocoa Touch动态库的创建入口:



跟随指引一步步操作即可创建一个新的动态库工程,我的工程名字叫Dylib,Xcode会同时创建一个和工程target同名的.h文件,比如我的就是Dylib.h。

向工程中添加文件

接下来就可以在工程中随意添加文件了。我在其中新建了一个名为Person的测试类,提供的接口如下:

1
2
3
4
5

@interface Person : NSObject

- (void)run;

@end

对应的实现部分:

1
2
3
4
56
7
8
9
10
11

@implementation Person

- (void)run
{
NSLog(@"let's run.");

UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"The Second Alert" message:nil delegate:nil cancelButtonTitle:nil otherButtonTitles:@"done", nil];
[alert show];
}

@end

设置开放的头文件

一个库里面可以后很多的代码,但是我们需要设置能够提供给外界使用的接口,可以通过Target—>Build Phases—>Headers来设置,如下图所示:



我们只需将希望开放的头文件放到Public列表中即可,比如我开放了
Dylib.h
Person.h
两个头文件,在生成的framework的Header目录下就可以看到这两个头文件,如下图所示:



一切完成,Run以后就能成功生成framework文件了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: