1 前言
笔者总结了自己在拥有Android
开发的相关基础后入门iOS
开发时遇到的点点滴滴给其他想入门iOS
开发的Android
开发的一些参考,少走一些弯路,快速上手iOS
开发;文章会以iOS
和 Android
的开发工具,语言,工程文件和启动类的对比为主线。两者的主要对比概览
平台 | IDE | 语言 | 依赖管理 | UI主界面 | 应用入口 |
---|---|---|---|---|---|
Android | Android Studio | java(kotlin) | maven | Activity | Application |
iOS | Xcode | object-c(swift) | Cocoapods | Controller | AppDelegate |
iOS
的开发工具 Xcode
可直接在线获取并安装,如果仅是简单的开发一个HelloWorld
工程,则可直接新建个工程运行就可。但如果需要使用其他第三方库时,则离不开Cocoapods
工具了;
Cocoapods
就是iOS
开发中的maven
,主要用于集成管理第三方的依赖库。本文仅简单介绍在Mac
下安装 Cocoapods
最快捷的安装方式 gem install cocoapods
,详细内容可参考文档cocoapods安装文档 ; 安装完成后在命令行运行:pod --version
查看本地安装的版本就可以,几个常用的pods
命令,这几个命令在开发中的使用概率非常大
命令 | 作用 |
---|---|
pods init | 创建podfile文件 |
pods install | 根据pofile.lock指定的版本去拉对应的依赖库 |
pods update | 更新依赖库(平时开发一般使用这个命令就可) |
备注:podfile
类似于Android开发中在 build.gradle
中指定第三方库的依赖和对应的版本的文件; podfile
的文件内容一般为:
#指定 pod的依赖来源方
source 'https://github.com/CocoaPods/Specs.git'
# 指定依赖的第三方库
pod `AFNetworking`,'4.0.1'
# 指定依赖的第三方库,大于某个版本
pod '***', '~> 1.8.4.0'
iOS
开发一般使用oc
或 swift
来开发,需要注意的是iOS
没有Android
里包的概念,类的名字必须保持全局唯一,一般约定是添加特定的前缀(公司 + 项目)如WXGPUImage
下面会以oc
为例来说明
头文件(*.h)里定义的方法和变量都是公共的,源文件(*.m)文件里定义的方法与变量是私有的;
property声明一个变量属性;
类的定义从@interface开始,到 @end结束;
类的实现则是从@implementation 到 @end结束;
对象初始化
NSString *saveKey = [NSString stringWithString:host];
[saveKey appendString:@"|"]; //非法
NSMutableString *saveKey = [NSMutableString stringWithString:@"123"];
[saveKey appendString:@"|"]; //合法
变量时的原子性(线程安全)
变量的内存相关:
@interface WSDemoObject : NSObject
//定义一个属性 @property(原子性,内存性)
@property (nonatomic, assign) NSInteger index;
// 构造方法
- (instancetype)initWithSymbolString:(NSString *)symbol;
// 静态方法
+ (void)callSomething;
@end
在iOS
中新建一个文件(类)时,文件类型一般会有以下四种类型:
optional
进行标识);//定义一个protocol
@protocol NsCopying
- (id) copyWithZone : (NSZone *) zone
@end
//采用协议,类似于Java的实现接口
@interface Car :NSObject<NsCopying,NSCoding>
{ // something
}
@end
NS_ASSUME_NONNULL_BEGIN
//Category,扩展AppDelegate的方法
@interface AppDelegate (WSTest)
- (id) copyWithZone : (NSZone *) zone
@end
NS_ASSUME_NONNULL_END
NS_ASSUME_NONNULL_BEGIN
//Extension,扩展AppDelegate的方法,小括号里无内容
@interface AppDelegate ()
- (id) copyWithZone : (NSZone *) zone
@end
NS_ASSUME_NONNULL_END
使用object-c
来编写一个单元测试的用例:
//类定义
@interface Singleton : NSObject
+(instancetype) shareInstance;
@end
//类实现
# import "Singleton.h"
@implementation Singleton
+(instancetype) shareInstance
{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_instance = [[self alloc] init];
});
return _instance;
}
iOS
应用的生命周期的管理主要是通过AppDelegate
来完成的,生命周期方法主要有:
iOS
中页面是由Controller
构造出来的,类似于Android
的 Activity
,其关键的生命周期为:
iOS
的工程是通过配置把项目的各个文件管理起来的,每个文件都会有一个唯一编号。新增代码文件时,IDE会自动在工程文件project.pbxproj
里给代码文件增加(修改)其对应编号。一般情况下是不需要手动去编辑project.pbxproj
文件,通过Xcode的选项buildsetting
、build Phases
就可修改project.pbxproj
了。但如果遇到协同开发,代码有冲突时,则需要直面该文件,并谨慎修改它。project.phxproj 文件
project.pbxproj
info.plist 工程描述文件
PS:这里为什么会把工程文件单独拉出来呢?协同开发时,解冲突最麻烦了,而iOS
里的工程文件冲突最不好解了,稍微不注意就会解错导致编译不了
在Android
工程中,有两种方式来依赖第三方的库:一种是通过直接把第三方库(.aar
,.jar
)放到library
目录,并在工程的gradle
文件里指定要编译的library
目录下的文件,另一种就是直接在gradle文件里写要依赖的第三方库,如
dependencies{
implementation 'com.tencent.qapm:abc:1.5.4' // 依赖abc库的 1.5.4版本
}
类似的,在iOS
工程里也有两种依赖第三方库的方法:一种是直接直接把第三方库(.a
,.framework
)放到工程目录中,并在buildsetting
里引用这些库,另一种就是使用pod
依赖了;
iOS
中的第三方库有两种形态:
静态库与动态库的区别主要在于在打包链接时的操作不一样;
静态库在打包生成可执行的目标文件时,会把汇编生成的目标文件.o
与引用的库一起链接打包到目标文件中,静态库的特点:
动态库与静态库类似,只是在打包时不用把所链接的文件全部拷贝进目标文件中,只是拷贝一些重定位和符号信息,这些信息在运行时可完成真正的链接,动态库的特点:
这里主要列举几个常用的UI控件
Android | iOS |
---|---|
View(ViewGroup) | UIView |
TextView | UILabel |
Button | UIbutton |
ImageView | UIImageView |
ListView(RecyclerView) | UITableView(UICollectionView) |
ScrollView | UIScrollView |
这五个主要View可以覆盖到80%的业务需求了,具体的用法可在使用到时自行搜索,这里就不再一一列举。
在创建一个Helloword
的 Demo时可直接利用Xcode创建项目的选项,一步步按照操作进行就可以了;虽然iOS
也可以在.storyboard
文件里进行界面的编写,但绝大部分时候都是需要使用代码来创建界面的,主要是在创建好的ViewController
的 viewDidLoad
方法里加入View来显示内容,eg:
//ps:代码是swift的,oc的代码也是类似的,只是语法有稍微的区别
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
let copyButton = UIButton(type:.custom)
copyButton.setTitle("Hello World", for: .normal)
//设置颜色
copyButton.titleLabel?.font = UIFont.boldSystemFont(ofSize: 13)
copyButton.backgroundColor = UIColor.blue
//设置大小(边界),关键(告诉系统在哪里绘制这个View)
copyButton.frame = CGRect.init(x: 0, y: 100, width:240, height:240)
//addTarget方法用来设置一些事件的处理,类似于Android的 addClickListener
// action 用来响应该事件的方法
// for : 要监听处理哪些事件
copyButton.addTarget(self, action: #selector(defaultButtonPressed), for: UIControl.Event.touchUpInside)
//把View加入到界面中
self.view.addSubview(copyButton)
}
本文分享自 stringwu的互联网杂谈 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有