创建静态
简介:
库是一些没有main函数的程序代码集合。除了静态库,还有动态链接库,他们之间的区别是:静态库可以编译到我们的执行代码中,应用程序可以在没有静态库的环境中运行;动态库不能编译到我们的执行代码中,应用程序必须在有链接库文件的环境下运行。
创建静态库的步骤如下所示,
1、创建DateTest,新建->Project,选择cocoa Touch Static Library,如图,
2、点击Next,我将cocoa Touch Static Library项目名称命名为DateTest,因为这是我用于处理时间和日期的静态库工程,
3、静态库文件功能的实现细节
创建了静态库DateTest项目之后,Xcode自动为我们创建了DateTest.h和DateTest.m文件,如下图所示
4、在DateTest.h文件 中写入
@interface DateTest : NSObject
- (NSString *)changeToStandardTime:(NSTimeInterval)timeInterval;
@end
5、在DateTest.m文件 中写入
@implementation DateTest
- (NSString *)changeToStandardTime:(NSTimeInterval)timeInterval
{
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
NSString *time = [dateFormatter stringFromDate:[NSDate dateWithTimeIntervalSince1970:timeInterval]];
return time;
}
@end
6、编译项目,生成对应的静态库.a文件
6.1、先来看一下在模拟器上编译(Command+B)之前的项目细节,如下图
这时候libDateTest.a文件变为黑色状态了,表明编译过后它是一个真是存在于物理磁盘的文件,我们右键选择Show in Finder,如下图,出现了它的物理位置,
6.2、再看一下在真机上编译(Command+B),过程同模拟器编译基本一样,不同的是在真机环境下进行编译,如下图
上面的Debug-iPhones里面包含iPhone真机所需要的libDateTest.a静态库文件,而下面的Debug-iPhoneSimulator里面包含的时iPhone模拟器所需要的libDateTest.a静态库文件。
7、合并静态库
针对真机和模拟器的静态库文件只能在一个平台下面使用,好在我们可以将真机和模拟器上面的静态库文件合并成一个在真机和模拟器都可以使用的静态库文件,通过在终端输入命令即可完成该目的。
打开终端输入:lipo -create 将真机和模拟器的静态库文件拖进终端
最后输入:- output /Users/用户名/Desktop/libTimeDate.a
完整的命令是:
lipo -create /Users/admin/Library/Developer/Xcode/DerivedData/DateTest-anjnqehnhjobgbgzsoxyxagyjqib/Build/Products/Debug-iphoneos/libDateTest.a /Users/admin/Library/Developer/Xcode/DerivedData/DateTest-anjnqehnhjobgbgzsoxyxagyjqib/Build/Products/Debug-iphonesimulator/libDateTest.a -output /Users/admin/Desktop/libDateTest.a
这样就在桌面生成了一个合并过后的libDateTest.a静态库文件,它可以再真机和模拟器上面同时使用。
8、使用静态库文件,
这时候我们就可以使用自己创建、编译生成的静态库文件了,将TimeDate.h文件和桌面上面的libTimeDate.a文件拖到想要使用的项目中,如下图的目录结构,
为了方便,在新建工程的AppDelegate中使用创建的静态库文件了,代码如下,
AppDelegate.m文件中引入#import "DateTest.h"
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
DateTest *dateTime = [[DateTest alloc] init];
NSTimeInterval timeInterval = 1234567890;
NSString *time = [dateTime changeToStandardTime:timeInterval];
NSLog(@"time is -------%@",time);
// Override point for customization after application launch.
return YES;
}
这时不管是真机还是模拟器都可以编译通过,正常运行。而使用者只能通过头文件知道我们提供的借口,却不知道实现文件中实现的细节,这有效地隐藏了自己的核心技术和机密内容。