Android开发快速入门iOS开发概览
注:本文同步发布于微信公众号:stringwu的互联网杂谈 Android开发快速入门iOS开发概览
1 前言
笔者总结了自己在拥有Android
开发的相关基础后入门iOS
开发时遇到的点点滴滴给其他想入门iOS
开发的Android
开发的一些参考,少走一些弯路,快速上手iOS
开发;
文章会以iOS
和 Android
的开发工具,语言,工程文件和启动类的对比为主线,一步步带你了解 iOS
版本的 HelloWord
是如何编写的;
两者的主要对比概览
平台 | IDE | 语言 | 依赖管理 | UI主界面 | 应用入口 |
---|---|---|---|---|---|
Android | Android Studio | java(kotlin) | maven | Activity | Application |
iOS | Xcode | object-c(swift) | Cocoapods | Controller | AppDelegate |
2 工具篇
iOS
的开发工具 Xcode
可直接在线获取并安装,如果仅是简单的开发一个HelloWorld
工程,则可直接新建个工程运行就可。但如果需要使用其他第三方库时,则离不开Cocoapods
工具了;
2.1 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'
3 语言篇
iOS
开发一般使用oc
或 swift
来开发,需要注意的是iOS
没有Android
里包的概念,类的名字必须保持全局唯一,一般约定是添加特定的前缀(公司 + 项目)如WXGPUImage
下面会以oc
为例来说明
3.1 基础语法
- 头文件(.h)里定义的方法和变量都是公共的,源文件(.m)文件里定义的方法与变量是私有的;
property
声明一个变量属性;- 类的定义从
@interface
开始,到@end
结束; - 类的实现则是从
@implementation
到@end
结束;
对象初始化
- [xxx new];
- [[xxx alloc]init]; //推荐使用
对象可变性:object-c里对象可变(类似于Java 里的final)和不可变时使用时使用的类是不一样的,以String为例子: - NSString :不可变;
- NSMutableString : 可变的;
NSString *saveKey = [NSString stringWithString:host];
[saveKey appendString:@"|"]; //非法
NSMutableString *saveKey = [NSMutableString stringWithString:@"123"];
[saveKey appendString:@"|"]; //合法
变量时的原子性(线程安全):
- atomic 默认的,只保证值有效,不保证这个值是什么;
- nonatomic,不保证你读到的是什么值;
变量的内存相关:
- weak,弱引用,不对所赋值对象进行持有,但是是安全的,对象不可用时,会被置为nil;
- strong,对新对象进行强引用,释放旧对象,其引用计数+1,用在ARC中,用于对象或指针类型的数据类型
- retain 对新对象进行强引用,释放旧对象,其引用计数+1,用在MRC中;
- assign,直接赋值,和引用计数无关,用于声明基本类型,如int;
- copy,在实现Setter方法时,采用copy函数,会生成新的对象被自己持有,一般用来修饰 NSString;
- unsafe_unretained,弱引用,和weak不同的是,若引用对象不可用,当前指针不会被置为nil,会产生野指针;
@interface WSDemoObject : NSObject
//定义一个属性 @property(原子性,内存性)
@property (nonatomic, assign) NSInteger index;
// 构造方法
- (instancetype)initWithSymbolString:(NSString *)symbol;
// 静态方法
+ (void)callSomething;
@end
3.2 文件类型
在iOS
中新建一个文件(类)时,文件类型一般会有以下四种类型:
- protocol,协议,类似于java的接口 (并且协议里方法可以选择是否是必须的,如果不是必须的,可使用关键字
optional
进行标识); - Extention,扩展 ,对某个类的功能进行扩展,需要拥有源码,生效于编译期;
- category,分类,也是对类的功能进行扩展,生效于运行期(可用于扩展系统类,只能扩展方法);
- 其他,正常的类文件;
//定义一个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
3.3 单例
使用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;
}
4 iOS篇
4.1 生命周期
iOS
应用的生命周期的管理主要是通过AppDelegate
来完成的,生命周期方法主要有:
applicationWillEnterForground ; //应用即将进入前台
applicationDidBecomeActive; //应用变成活跃
applicationWillResignActive;
applicationDidEnterBackground ;//应用即将进入后台
applicationWillTerminate ; // 应用程序即将终止的回调;
iOS
中页面是由Controller
构造出来的,类似于Android
的 Activity
,其关键的生命周期为:
- loadView : 加载View(一般使用xib构建时)
- viewDidLoad: View 加载完毕 ;//类似于Activity.onCreate
- viewWillAppear: View将要显示;//类似于Activity.onStart
- viewDidAppear :View完全显示;//类似于Activity.onResume
- viewWillDisappear:View将到消失;//类似于Activity.onPause
- viewDidDisappear:View完全消失;//类似于Activity.onDestory
4.2 工程文件
iOS
的工程是通过配置把项目的各个文件管理起来的,每个文件都会有一个唯一编号。新增代码文件时,IDE会自动在工程文件project.pbxproj
里给代码文件增加(修改)其对应编号。一般情况下是不需要手动去编辑project.pbxproj
文件,通过Xcode的选项buildsetting
、build Phases
就可修改project.pbxproj
了。但如果遇到协同开发,代码有冲突时,则需要直面该文件,并谨慎修改它。
project.phxproj 文件
- project.pbxproj
- info.plist 工程描述文件
PS:这里为什么会把工程文件单独拉出来呢?协同开发时,解冲突最麻烦了,而iOS
里的工程文件冲突最不好解了,稍微不注意就会解错导致编译不了
4.3 第三方依赖
在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是可以对类进行扩展的,如果有两个库同时对一个公共类进行了扩展,并且扩展的方法是一样的,则有可能会发生运行时错误),一般建议如果是对公共的类或库进行扩展时,扩展的方法名也带上前缀,这样可以避免很多坑;
iOS
中的第三方库有两种形态:
- 静态库,后缀为(.a,.framework)
- 动态库,后缀为(.dylib,.framework)
静态库与动态库的区别主要在于在打包链接时的操作不一样;
4.3.1 静态库
静态库在打包生成可执行的目标文件时,会把汇编生成的目标文件.o
与引用的库一起链接打包到目标文件中,静态库的特点:
- 在编译期完成对函数库的链接
- 运行时与函数库不再有关,可独立运行;
- 会比较占用空间(如果有函数库被多个静态库依赖,则这个函数库里会有多份拷贝)
- 更新麻烦,如果静态库A更新了,则所有依赖静态库A的库都需要重新编译,更新;
- 加载速度较动态库快
4.3.2 动态库
动态库与静态库类似,只是在打包时不用把所链接的文件全部拷贝进目标文件中,只是拷贝一些重定位和符号信息,这些信息在运行时可完成真正的链接,动态库的特点:
- 在运行时完成对函数库的链接(不同应用程序调用相同的库,在内存里只需要有一份该库的实例);
- 运行时与函数库有关,需要依赖对应的函数库才可运行;
- 会比较省空间(只需要拷贝少量的符号与链接信息)
- 更新简单,只需要更新对应的动态库就可以了;
- 可以用来实现进程之间的资源共享;
- 加载速度较静态库慢;
5 View篇
这里主要列举几个常用的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)
}
6参考
Android开发快速入门iOS开发概览的更多相关文章
- HealthKit开发快速入门教程之HealthKit框架体系创建健康AppID
HealthKit开发快速入门教程之HealthKit框架体系创建健康AppID HealthKit开发准备工作 在开发一款HealthKit应用程序时,首先需要讲解HealthKit中有哪些类,在i ...
- Transform组件C#游戏开发快速入门
Transform组件C#游戏开发快速入门大学霸 组件(Component)可以看作是一类属性的总称.而属性是指游戏对象上一切可设置.调节的选项,如图2-8所示.本文选自C#游戏开发快速入门大学霸 ...
- HealthKit开发快速入门教程之HealthKit数据的操作
HealthKit开发快速入门教程之HealthKit数据的操作 数据的表示 在HealthKit中,数据是最核心的元素.通过分析数据,人们可以看到相关的健康信息.例如,通过统计步数数据,人们可以知道 ...
- HealthKit开发快速入门教程之HealthKit开发概述简介
HealthKit开发快速入门教程之HealthKit开发概述简介 2014年6月2日召开的年度开发者大会上,苹果发布了一款新的移动应用平台,可以收集和分析用户的健康数据.该移动应用平台被命名为“He ...
- Apple Watch开发快速入门教程
Apple Watch开发快速入门教程 试读下载地址:http://pan.baidu.com/s/1eQ8JdR0 介绍:苹果为Watch提供全新的开发框架WatchKit.本教程是国内第一本A ...
- 游戏控制杆OUYA游戏开发快速入门教程
游戏控制杆OUYA游戏开发快速入门教程 1.2.2 游戏控制杆 游戏控制杆各个角度的视图,如图1-4所示,它的硬件规格是本文选自OUYA游戏开发快速入门教程大学霸: 图1-4 游戏控制杆各个角度的 ...
- SpringBoot开发快速入门
SpringBoot开发快速入门 目录 一.Spring Boot 入门 1.Spring Boot 简介 2.微服务 3.环境准备 1.maven设置: 2.IDEA设置 4.Spring Boot ...
- WPF开发快速入门【7】WPF的拖放功能(Drag and Drop)
概述 本文描述WPF的拖放功能(Drag and Drop). 拖放功能涉及到两个功能,一个就是拖,一个是放.拖放可以发生在两个控件之间,也可以在一个控件自己内部拖放.假设界面上有两个控件,一个Tre ...
- iOS开发UI篇—IOS开发中Xcode的一些使用技巧
iOS开发UI篇—IOS开发中Xcode的一些使用技巧 一.快捷键的使用 经常用到的快捷键如下: 新建 shift + cmd + n 新建项目 cmd + n 新建文 ...
- iOS开发UI篇—iOS开发中三种简单的动画设置
iOS开发UI篇—iOS开发中三种简单的动画设置 [在ios开发中,动画是廉价的] 一.首尾式动画 代码示例: // beginAnimations表示此后的代码要“参与到”动画中 [UIView b ...
随机推荐
- 基于Java+SpringBoot+Mysql实现的古诗词平台功能设计与实现一
一.前言介绍: 1.1 项目摘要 随着信息技术的迅猛发展和数字化时代的到来,传统文化与现代科技的融合已成为一种趋势.古诗词作为中华民族的文化瑰宝,具有深厚的历史底蕴和独特的艺术魅力.然而,在现代社会中 ...
- 使用wxpython开发跨平台桌面应用,动态工具的创建处理
在我们开发系统的时候,往往需要一个很容易理解功能的工具栏,工具栏是一个系统的快速入口,美观易用的工具栏是可以给系统程序增色不少的,本篇随笔介绍在使用wxpython开发跨平台桌面应用,工具栏的动态展现 ...
- php字符串练习题
把以前发给别人的练习题邮件备份记录一下 1.用php编写统计二维数组内某个字符出现的次数的一个函数.给定二维数组和字符串,返回这个字符串在二维数组中出现的次数. 例: 数组如下: $array=arr ...
- 无加密的机密性:Chaffing and Winnowing原理和C#实验仿真
最近在Crypto 2023上看到一篇有趣的文章[1],其旨在一个存在拥有所有密钥并知道所有消息的"独裁者"的信道中,通过安排与常规密文无法区分的隐藏的"变形" ...
- Swing 线程之SwingUtilities.invokeLater()
现在我们要做一个简单的界面. 包括一个进度条.一个输入框.开始和停止按钮. 需要实现的功能是: 当点击开始按钮,则更新进度条,并且在输入框内把完成的百分比输出(这里只做例子,没有真正去做某个工作). ...
- 解决window.close()在谷歌浏览器不起作用
简单明了直接上解决方法: let url = ' '; // 空字符串中间要加空格 window.open(url, '_self').close();
- python之发送邮件(smtplib)
我们在测试完成后,都会发一份邮件也就是我们的测试报告,那么既然要自动化,是不是也可以通过python帮助我们发送邮件?当然这么强大的python可以帮助你完成这个需求 SMTP SMTP(Simple ...
- elastic8.4.0搜索+logstash<=>mysql实时同步+kibana可视化操作+netcore代码笔记
做全文搜索,es比较好用,安装可能有点费时费力.mysql安装就不说了.主要是elastic8.4.0+kibana8.4.0+logstash-8.16.1,可视化操作及少了netcore查询代码. ...
- 有关终端Github无法访问,connection timed out:443等问题
有关终端Github无法访问,connection timed out:443等问题 SSL_connect: Operation timed out in connection to github. ...
- 实用干货分享(3)- Git常用操作干货分享
官方学习地址 https://git-scm.com/book/zh/v2 简单的代码提交流程 1. git status 查看工作区代码相对于暂存区的差别: 2. git add . 将当前目录下修 ...