专栏首页张志敏的技术专栏iOS 静态类库项目的创建与使用

iOS 静态类库项目的创建与使用

iOS 静态类库项目的创建与使用

新建 Xcode workspace

打开 Xcode , 选择 File -> New -> Workspace , 将 Workspace 命名为 Test.xcworkspace , 并选择合适的目录。

新建 Static Library 项目

选择 File -> New -> Project , 项目模板选择 Cocoa Touch Static Library , 项目名称命名为 MyLib.xcodeproj , 注意选中 Use Automatic Reference Counting 。

Xcode 会在项目中自动生成 MyLib.h 和 MyLib.m 文件, 单击 MyLib.h 文件, 添加下面的两个方法定义:

- (NSInteger) add:(NSInteger)a and:(NSInteger)b;
+ (NSString*) connect:(NSString*)str1 and:(NSString*)str2;

再打开 MyLib.m 文件, 添加刚刚定义两个文件的实现:

- (NSInteger) add:(NSInteger)a and:(NSInteger)b {
    return a + b;
}

+ (NSString*) connect:(NSString *)str1 and:(NSString *)str2 {
    return [NSString stringWithFormat:@"%@ %@", str1, str2];
}

现在, 最终的文件看起来是这样的:

//
//  MyLib.h
//  MyLib
//
//  Created by gdeic on 4/16/12.
//  Copyright (c) 2012 __MyCompanyName__. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface MyLib : NSObject

- (NSInteger) add:(NSInteger)a and:(NSInteger)b;

+ (NSString*) connect:(NSString*)str1 and:(NSString*)str2;

@end

//
//  MyLib.m
//  MyLib
//
//  Created by gdeic on 4/16/12.
//  Copyright (c) 2012 __MyCompanyName__. All rights reserved.
//

#import "MyLib.h"

@implementation MyLib

- (NSInteger) add:(NSInteger)a and:(NSInteger)b {
    return a + b;
}

+ (NSString*) connect:(NSString *)str1 and:(NSString *)str2 {
    return [NSString stringWithFormat:@"%@ %@", str1, str2];
}

@end

选中 MyLib 项目, 在中间的编辑器窗口中选择项目的 Target , 选择 Build Phases 标签, 展开 Copy Headers 分组, 下面有三个子分组, 分别是 Public 、 Project 与 Private , 将 MyLib.h 拖拽到 Public 分组即可。

保存所有文件, 选择 Product -> Build , 进行编译, 生成 libMyLib.a 文件, 同时也会将 MyLib.h 文件复制到输出目录。

使用静态类库项目

选择 File -> New -> Project , 项目模板选择 iOS -> Application -> Single View Application , 项目名称命名为 MyApp , 注意勾选 Use Storyboards 和 Use Automatic Reference Counting 。

建好项目之后, 项目窗口如下如所示:

将 MyLib 项目拖拽到 MyApp 项目的 Frameworks 文件夹, 在弹出的对话框中选择 Create groups for any added folders , 然后点击 Finish 按钮。

选中 MyApp 项目, 在选择项目的目标 (Target) , 选中 Summary 标签页下找到 Linked Frameworks and Library 分组选项, 如下图:

点击下面的加号按钮, 将工作区的 libMyLib.a 添加进去。

接下来添加头文件搜索目录, 选中 Targets 上面的 Project , 选择 Build Settings 标签页,在搜索框内输入 header search 进行过滤, 找到 Header Search Paths , 添加一行, 输入 ../MyLib , 并选中递归复选框。

现在要先验证一下对 MyLib 的引用是否正确, 打开 MyApp 项目的 ViewController.m , 添加对 MyLib.h 的引用, 如下图所示, 并编译 MyApp , 如果编译成功, 则表示引用正确。

打开 MainStoryboard.storyboard 文件, 在生成的 ViewController 上添加两个 UITextField 、 两个 UIButton 以及一个 UILabel, 如下图所示:

并添加相应的 outlet 和 action , ViewController.h 如下:

//
//  ViewController.h
//  MyApp
//
//  Created by gdeic on 4/19/12.
//  Copyright (c) 2012 __MyCompanyName__. All rights reserved.
//

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController

@property (weak, nonatomic) IBOutlet UITextField *textField1;
@property (weak, nonatomic) IBOutlet UITextField *textField2;
@property (weak, nonatomic) IBOutlet UILabel *resultLabel;

- (IBAction)addButtonClick:(id)sender;
- (IBAction)connectButtonClick:(id)sender;

@end

打开 ViewController.m 文件, 实现 addButtonClick: 和 connectButtonClick: 方法, 在 addButtonClick: 方法中调用 MyLib 的实例方法 add:and: , 在 connectButtonClick: 方法中调用 MyLib 的静态方法 connect:and: , 如下所示:

- (IBAction)addButtonClick:(id)sender {
    // 获取用户输入的两个数字
    NSInteger num1 = [self.textField1.text integerValue];
    NSInteger num2 = [self.textField2.text integerValue];
    // 初始化一个新的 MyLib 实例
    MyLib* myLib = [[MyLib alloc] init];
    // 调用实例方法相加
    NSInteger result = [myLib add:num1 and:num2];
    // 显示结果
    self.resultLabel.text = [NSString stringWithFormat:@"%d + %d = %d", num1, num2,result];
}

- (IBAction)connectButtonClick:(id)sender {
    // 获取用户输入的两个字符串
    NSString* str1 = self.textField1.text;
    NSString* str2 = self.textField2.text;
    // 调用 MyLib 的静态方法连两个字符串
    NSString* result = [MyLib connect:str1 and:str2];
    // 显示结果
    self.resultLabel.text = result;
}

点击添加按钮时, 效果如下图所示:

点击 Connect 按钮时, 效果如下图所示:

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 使用 Castle Windsor 实现 Web API 依赖注入

    Web API 定义了依赖注入的接口 IDependencyResolver , 定义如下:

    beginor
  • 使用 MonoDevelop 调试 Unity3D 的正确步骤

    Unity3D 是一个基于 Mono 的跨平台游戏引擎,支持 PC 、MAC 、 Android 、IOS 等多种平台,其 3.0 以后的版本支持用 Mono...

    beginor
  • C# 程序在 Docker 中响应 Unix 信号

    在 Docker Entry Script 详解中介绍了如何在 shell 脚本中响应 Unix 信号量来实现 Docker 应用优雅的关闭退出, 本文介绍 C...

    beginor
  • asp.net core合并压缩资源文件引发的学习之旅

    重启vs2017,卧槽。一遍又一遍无响应(家里公司电脑都没有成功~)..幸好还有其他路可以走...

    易墨
  • 代码审计| 这是一款适合练手的漏洞

    0x00 背景 本周,斗哥分析了下zzcms8.2的源码,发现蛮多问题的,觉得这个源码适合萌新们练手或入坑PHP的代码审计。今天决定发出一些发现的问题,当然这个...

    漏斗社区
  • 如何快速定位找出SEGV内存错误的程序Bug

    通过查看php日志/usr/local/php/var/log/php-fpm.log,有如下警告信息:

    sunsky
  • CMake 进行调试

    在 Linux 下开发,可以用 gdb 进行调试,但是如果工程是用 CMake 构建的,那么需要在 CMakeLists.txt 中加入如下代码:

    Frank909
  • 指标存储: 我们如何从Graphite + Whisper迁移到Graphite + ClickHouse

    之前在文章监控即服务:用于微服务架构的模块化系统我写了关于微服务架构的模块化监控系统的组织。没有什么是静止的,我们的项目在不断增长,存储的指标列表也在增长。在这...

    后场技术
  • Qt5.12 + OpenGL 创建第一个多边形Core版

    https://learnopengl-cn.github.io/01%20Getting%20started/04%20Hello%20Triangle/

    用户5908113
  • linux core文件机制

    在程序不寻常退出时,内核会在当前工作目录下生成一个core文件(是一个内存映像,同时加上调试信息)。使用gdb来查看core文件,可以指示出导致程序出错的代码所...

    一见

扫码关注云+社区

领取腾讯云代金券