注:本文同步发布于微信公众号: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,其关键的生命周期为:

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开发概览的更多相关文章

  1. HealthKit开发快速入门教程之HealthKit框架体系创建健康AppID

    HealthKit开发快速入门教程之HealthKit框架体系创建健康AppID HealthKit开发准备工作 在开发一款HealthKit应用程序时,首先需要讲解HealthKit中有哪些类,在i ...

  2. Transform组件C#游戏开发快速入门

    Transform组件C#游戏开发快速入门大学霸 组件(Component)可以看作是一类属性的总称.而属性是指游戏对象上一切可设置.调节的选项,如图2-8所示.本文选自C#游戏开发快速入门大学霸   ...

  3. HealthKit开发快速入门教程之HealthKit数据的操作

    HealthKit开发快速入门教程之HealthKit数据的操作 数据的表示 在HealthKit中,数据是最核心的元素.通过分析数据,人们可以看到相关的健康信息.例如,通过统计步数数据,人们可以知道 ...

  4. HealthKit开发快速入门教程之HealthKit开发概述简介

    HealthKit开发快速入门教程之HealthKit开发概述简介 2014年6月2日召开的年度开发者大会上,苹果发布了一款新的移动应用平台,可以收集和分析用户的健康数据.该移动应用平台被命名为“He ...

  5. Apple Watch开发快速入门教程

     Apple Watch开发快速入门教程  试读下载地址:http://pan.baidu.com/s/1eQ8JdR0 介绍:苹果为Watch提供全新的开发框架WatchKit.本教程是国内第一本A ...

  6. 游戏控制杆OUYA游戏开发快速入门教程

    游戏控制杆OUYA游戏开发快速入门教程 1.2.2  游戏控制杆 游戏控制杆各个角度的视图,如图1-4所示,它的硬件规格是本文选自OUYA游戏开发快速入门教程大学霸: 图1-4  游戏控制杆各个角度的 ...

  7. SpringBoot开发快速入门

    SpringBoot开发快速入门 目录 一.Spring Boot 入门 1.Spring Boot 简介 2.微服务 3.环境准备 1.maven设置: 2.IDEA设置 4.Spring Boot ...

  8. WPF开发快速入门【7】WPF的拖放功能(Drag and Drop)

    概述 本文描述WPF的拖放功能(Drag and Drop). 拖放功能涉及到两个功能,一个就是拖,一个是放.拖放可以发生在两个控件之间,也可以在一个控件自己内部拖放.假设界面上有两个控件,一个Tre ...

  9. iOS开发UI篇—IOS开发中Xcode的一些使用技巧

    iOS开发UI篇—IOS开发中Xcode的一些使用技巧 一.快捷键的使用 经常用到的快捷键如下: 新建 shift + cmd + n     新建项目 cmd + n             新建文 ...

  10. iOS开发UI篇—iOS开发中三种简单的动画设置

    iOS开发UI篇—iOS开发中三种简单的动画设置 [在ios开发中,动画是廉价的] 一.首尾式动画 代码示例: // beginAnimations表示此后的代码要“参与到”动画中 [UIView b ...

随机推荐

  1. Docker Compose容器编排--项目五

    一.Docker Compose概念 Docker Compose (可简称Compose)是一个定义与运行复杂应用程序的 Docker 工具,是 Docker 官方 编排(Orchestration ...

  2. 2-1 C++内置类型

    目录 2.1.1 算术类型(Arithmetic Types) 概览 分类 整型与浮点型 有符号和无符号 存储 单位转换 常见类型的大小 几点说明 选择 2.1.2 类型转换(Type Convers ...

  3. 【VMware VCF】通过备份的配置文件还原 SDDC Manager 组件。

    之前在这篇文章(使用 SFTP 服务器备份 VCF 核心组件的配置文件.)中配置并备份了 VCF 环境中 SDDC Manager 组件的配置文件,这篇文章接着这个主题,看看当 SDDC Manage ...

  4. C# 串口读取并转换字符串

    public string ReadString() { ASCIIEncoding ascii = new ASCIIEncoding(); byte[] readBuffer = new byte ...

  5. CommonsCollections5(基于ysoserial)

    环境准备 JDK1.8(8u421)我以本地的JDK8版本为准.commons-collections(3.x 4.x均可这里使用3.2版本) cc3.2: <dependency> &l ...

  6. 《刚刚问世》系列初窥篇-Java+Playwright自动化测试-6- 元素基础定位方式-上篇 (详细教程)

    1.简介 从这篇文章开始,就开始要介绍UI自动化核心的内容,也是最困难的部分了,就是:定位元素,并去对定位到的元素进行一系列相关的操作.想要对元素进行操作,第一步,也是最重要的一步,就是要找到这个元素 ...

  7. PHP5.2-5.6不同版本新特性

    温故而知新, 时常复习下之前的东西 还是会有一些收获 本文目录:PHP5.2 以前:autoload, PDO 和 MySQLi, 类型约束PHP5.2:JSON 支持PHP5.3:弃用的功能,匿名函 ...

  8. Kafka之入门

    什么是 Kafka Kafka 是一个分布式流式平台,它有三个关键能力 订阅发布记录流,它类似于企业中的消息队列 或 企业消息传递系统 以容错的方式存储记录流 实时记录流 Kafka 的应用 作为消息 ...

  9. element-ui季度选择组件

    1.基于elementui开发的季度选择组件 2.调用 <el-quarter-picker v-model="start_time" :size="size&qu ...

  10. 强网杯2023 谍影重重2.0 wp

    题目描述 小明是某间谍组织的一员,他终日监听着我国某重点军事基地的飞行动态,妄图通过分析参数找到我国飞的最快的飞机.我国费尽千辛万苦抓住了他,并在他的电脑上找到了一段他监听的信息,请分析出这段信息中飞 ...