iOS狂暴之路(开始篇)

Wesley13
• 阅读 652

一、学习路线规划

现如今移动端的两大平台Android和iOS是风光无限,但是又有谁能够保证这两个平台能够昌盛一辈子呢?谁也不敢保证其中一个在未来几年之后就会成为第二个诺基亚,所以我们现在会Android的同学应该考虑学习iOS,会iOS同学也是否要考虑学习Android。那么从这篇文章开始我们就来开启我们的iOS学习之旅,但是这里的前提是你会一些基础的C语言语法和OC语法以及Android的开发经验,关于C语言,这是大学必学的一门课程,所以不了解的同学需要自行搞定了,而对于OC语法的介绍,在之前我已经很详细的介绍了十几章内容,不了解的同学可以点击这里:OC学习概要总结 当然如果有了Android的开发经验的话,那么学习起来就更方便和容易了,因为iOS和Android在很多方面都有相似之处,有的地方可能完全一样,只是Api不同,而且在后续的介绍中,会将OC语法和Java语法进行比较,iOS和Android进行比较讲解。下面就来看一下我们学习iOS的路线:

iOS狂暴之路(开始篇)

通过上面的一张图,我们可以看到iOS的学习路线和当初Android的学习路线差不多,在移动端平台中,其实最主要的就是四大核心基础模块:UI控件视图使用、多线程、网络访问、数据本地存储;只要把这四个核心点弄清楚了,在加上后续的项目实践,以及后续的经验积累,iOS进阶还是很简单的,而且后面会发现其实iOS把有些功能封装的太好了,以至于没有像Android中那么复杂,比如保存用户的设置信息,在iOS中使用两行代码即可完成,而在Android中可能需要6~7行代码去做。还有一个最核心点就是动画效果的实现,做过Android的同学应该知道在Android中实现一些特殊的动画还是比较费劲的,在iOS中实现起来就非常简单,简单的原因就是他把api封装的太好了,我们只要傻瓜式的调用即可,当然也要知道他的原理。下面就上面几点来一一讲解一下:

二、学习路线知识总结

第一、C语言基础知识讲解

作为一个计算机科班的人,C语言应该是大学中必须的一门课程,不管你最后是选择了Java还是PHP这样的语言,C语言是最核心的C系语言,所谓C系语言就是大致语法都相同的,比如Java,C++,OC等都是C系语言,所以这些语言相互学习是非常简单的,当然以前还有B系语言,像B语言,VB等,他们的语法结构就很类似了。

那么为什么说C语言基础知识必须要了解呢?当初在学习Android的时候,其实后续要使用到NDK开发,C语言也是必须要掌握的,他是核心基础语言,因为后续开发iOS还是会使用OC语言作为基础,那么在开发中,会发现在iOS程序中会经常用到一些C语言的函数和功能,所以C语言必须要掌握,但是我们最主要的还是需要掌握C语言中最核心的几个知识点:指针,结构体和数组;关于其他的知识大致和Java类似,如果你学习过Java的话,关于指针在iOS开发中用到的是最多了,准确的说以后只要在iOS中如果定义一个类型是NS开头的,那么一般都是指针类型,比如:NSString* str;如果是结构体类型的一般是CGRect rect;所以从这一点上我们可以很好的区分类型结构了,而对于指针还有一个重要意义就是能够从一个函数中得到多个返回值,这个也是在开发中经常会用到的,比如在iOS开发中有一个方法执行了一个功能,我们即想知道这个方法执行的结果如何,又想知道执行的过程信息,那么这时候肯定是要返回两个信息了,在Java中我们可能会自定义一个类型封装这两个信息,或者使用回调机制,但是在OC中可以直接使用指针作为一个信息的返回状态,比如:BOOL xxx_YYY:(NSInteger)arg1 zzz:(NSError**)error; 这里看到最后一个参数就可以从函数中得到功能的执行的错误信息,看到他是二级指针,我们在外面只需要定义一个NSError* error1 = nil;然后使用&error1传递参数进入,最后就可以得到这个信息了,这里的&号就是取一个变量的地址,所以这么看到指针就是地址,地址就是指针。

说到指针,还有一个重要的知识点就是函数指针,关于函数指针的作用就可以想成类似于Java中的回调功能,可以在一个函数中传入一个函数指针类型,在函数内部使用函数指针来调用这个函数功能;当然在OC中也有回调机制只不过叫做协议功能,类似于Java中的接口类型。

第二、OC语言基础回顾

在多年前,我就已经介绍了OC的所有基础语法知识,如果不了解的同学,可以点击这里进入查看:OC学习路线概要 当时讲解的已经非常详细了,但是不是所有的知识都会用到,比如谓词这些功能可能用的就比较少了。但是有些核心知识点用的还是比较多的。

1、OC中类的定义以及方法的定义

虽然OC和Java同属于C系语言,但是他们的语法结构还是有些区别的,比如他们定义类的方式就有很大的区别,所以学习Android的同学转iOS刚开始第一步就得多写代码多习惯OC语法即可。OC中新建一个类会产生两个文件,一个是头文件.h,还有一个是类实现文件.m;一般.h文件中定义的是这个类的类型:

**@interface 类名:NSObject{
定义属性
}
定义方法
**

@end

而在.m中一般是类的具体实现:

**@implementation
**

**实现方法方法
**

@end

这里看到,OC中定义类没有使用{},而是使用@关键字进行划分区域的。

而在OC中定义方法也是和Java有些区别的:

方法说明 (返回类型) 方法名 : (参数类型)参数名称
1》、方法说明有两种:
一种是减号:"-",表示该方法是对象方法,就是必须用对象实例才能调用的
一种是加号:"+",表示该方法是类方法,就是可以用类直接调用的,不需要实例化对象的,类似于Java中的static方法
2》、返回类型:这个就简单了,和Java语言很类似了

上面就是OC中定义类和方法的格式,然后就会涉及到OC语言中几个核心的知识点:

2、协议和分类

OC中的协议很好理解,就是Java中的接口类型,而对于分类的话,可能在Java中实现起来比较麻烦而且还有限制,他就是对一个已有的类进行添加一些新的功能,比如系统中操作字符串的类NSString,他没有校验邮箱的这个功能,那么我们就可以给NSString添加一个分类,自己写一个校验邮箱的这个功能,后续再使用NSString类型的话就可以直接调用这个功能即可,但是在Java中我们知道String类是final类型的,不能继承了,所以实现不了这种扩展功能了。

3、KVC和KVO操作

这两个功能个人认为是OC中比较好的功能了,在Java中也有相对应的功能,但是还需要我们手动的去写,而且没有一定规则很麻烦。其实这两个操作都是针对于OC中的属性进行操作的,其中KV是值键值对Key-Value,而KVC就是属性键值对进行编码(Coding);意思就是可以操作属性,比如可以通过属性名去设置该属性的值,在Java中可以使用内省或者是反射机制去实现,因为在Java中属性的规定是,只要有对应的get和set方法的都叫做属性,而属性名是getXXX方法的XXX和具体定义的属性名没有关系,但是在OC中属性名就是我们定义的属性名,而get和set方法是系统自动生成的。而KVO操作就是键值对属性的观察者(Observer),这个功能的作用就是可以监听一个类的属性的值的变化,这个用途还是很大的,比如想跟踪一个属性的值的变化状态,然后做一些指定事件触发等,其实这个功能在Java中也是可以实现的,但是Java中并没有那么强的规则,比如有些人会定义属性直接使用public类型,然后没有定义get和set方法,这么在调用一个属性的时候就肯定观察不到了,除非监控内存了。如果Java中有很强的规则,属性必须是private的,然后使用的时候必须调用set和get方法,我们只需要在这两个方法中加一个监听回调也是可以做到KVO的功能的。

4、集合类功能

OC中和Java类似,一些集合类用的非常多,在OC中像NSArray和NSDirctionary用的比较多,他们相当于Java中的List和Map结构,而在OC中还需要注意的就是如果类型中没有Mutable的类型都是不可变结构类型,比如NSArray数组,他是不能进行增删改操作的,而对应的NSMutableArray类型才可以,不知道为何要这么设计。后续很多类型都会是这种规则。

5、基础功能类框架:Founction

这个框架类似于java中的lang包和util包中的类功能,OC中的Function框架包括了基础的功能类,比如上面的集合类,还有常用的NSNumber类:主要用来操作数据类型的;NSData类:操作日期类型的,当然还有一个类的鼻祖NSObject类也是在这个框架中

第三、UI知识概要

从这个知识点,我们将正式开始iOS应用编写的功能了,前面的知识点只是基础。关于iOS中的UI知识学习会比Android中的UI简单的非常多,这里不会详细介绍,后续会单独介绍,主要介绍几个方面:

1、iOS中常见常用控件介绍:包括显示文本控件UILabel,显示图片控件UIImageView,显示提示框控件UIAlertView,开关控件UISwitch,而这些控件我们知道都是系统的,因为iOS系统本生的这些控件设计的就很完美了,所以一般都是直接拿来就是用,而不像Android中系统的对话框不是那么美观,很多情况下都会从新定义设计

2、iOS中高级View介绍:这里主要介绍两个重要的功能控件:UITableView和UIScrollView,其中UITableView就是Android中的ListView用法都差不多,而UIScrollView类似于Android中的ScrollView,但是他的功能比ScrollView强大很多,在iOS中实现分页,切换页都是使用这个控件进行操作的,而在Android中会使用ViewPager来实现。

3、自定义视图View介绍:不管是Android开发还是iOS开发,一些系统的控件有时候满足不了我们的需求,那么这时候就需要去自定义一些控件了,自定义控件和Android中也很类似,iOS中继承UIView之后,在drawRect方法中使用CGContextRef类进行绘制各种图形即可,在Android中我们知道是在onDraw中使用Canvas进行绘制的。

4、控制器介绍:iOS中的控制器就和Android中的Activity组件功能类似,可以展示View,有自己的生命周期方法,而控制器系统提供了两个常用的控制器:UINavigationController和UITabBarController,这两个控制器的使用场景是UINavigationController主要用来操作视图的导航功能,比如从一个页面跳转到另一个页面,这个控制器其实就是一个栈功能,进入的话就用push操作,出来的时候使用pop功能来实现指定的页面跳转功能,在Android中比较费劲还得使用Intent来进行startActivity操作。另外一个UITabBarController功能主要是用来菜单视图切换功能,必须现在的微信页面中,底部的四个菜单切换功能。当然我们还可以自定义一个控制器功能。

5、视图控件的事件功能介绍:Android中我们知道有很多事件需要特殊处理,比如ListView的向下滑动,ViewPager的左右滑动等,在iOS中也是一样,有些特殊需求就要处理事件。

第四、多线程操作

iOS中的多线程操作比Java中的线程操作方便点,因为他的Api比较少,主要就是四个知识点:

1、自定义线程NSThread类,类似于Java中的Thread类

2、任务类NSOperation,类似于Java中的Runnable类

3、任务队列类NSOperationQueue,类似于Java并发库中的Queue类

4、GCD功能,这个功能主要是C语言实现的,他的优势可以重复利用设备的多核硬件资源,让多线程操作更加高效,也是苹果官方提倡使用的一种方式

第五、数据本地存储

iOS开发中有时候想把一些数据保存到本地,每个应用都有自己的沙盒结构,这个和Android中很类似,只有本应用才有权限进行操作,Android中的数据存储主要包括:SharedPreference,数据库,SD卡等。而在iOS中主要包括以下几点:

1、Plist:一般可以把数组和字典数据对象保存到本地的plist文件中.
2、Preference:保存用户的基本设置,和Android中的SharedPreference类似。
3、NSKeyedArchiver:归档和解档,可以把对象进行序列化,和Java中的ObjectInputStream类似。
4、SQLite:数据库操作,和Android中底层使用的数据库是一样的,但是这里是采用的纯C语言实现的。
5、CoreData:ORM操作的,可以把对象和数据库表联系操作。

第六、网络访问功能

任何一个移动平台必不可少的就是网络访问功能,在Android中用的比较多的就是HttpClient类了,在iOS中有类似有一些系统提供的网络访问api使用,主要涉及到这些类:

1、NSURL:定义一个网络访问的URL地址。
2、NSURLRequest:网络访问请求对象,可以设置请求的参数设置。
3、NSURLConnection:直接连接访问,系统自动创建一个子线程进行操作。
4、UIWebView:这个和Android中的WebView很类似,可以访问网页内容,但是他和Android中的WebView还是有一些区别的。

大家是否回想起Android中WebView的一个经典漏洞就是在JS中可以使用getClass获取到对象类对象,然后调用Runtime类执行命令获取设备数据信息,就是因为在Android中可以使用addJavascriptInterface方法设置本地对象导致的,在iOS中不可以这么做的,如果想在JS中调用本地方法得想其他办法了。

第七、开发中常用框架介绍

不管是Android还是iOS平台,在实际开发过程中只依靠系统提供的功能api往往会达不到我们想要的功能,而且效率使用并没有那么高,那么一些主流的开发框架就出现了,一般主要涉及到的框架是网络访问,图片加载,下拉刷新控件,数据库操作等,在Android中这些功能都有的一个著名框架:xUtils。用这个框架可以速度搭建一个app,很多功能好用还方便。iOS中的一些主流开发框架也是如此,主要就这几个模块:

1、网络访问框架:AFNetworking
2、网络图片加载框架:SDWebImage
3、列表下拉刷新框架:MJRefresh
4、数据库操作框架:FMDB
5、UIWebView和本地交互框架:WebViewJavascriptBridge
6、数据缓存框架:YYKit

第八、实践项目演练

上面说到的都是开发技术点,而往往在真正使用这些点,就必须借助几个实际项目来进行实战一下,这样才能遇到更多的问题去解决,了解的更多同时一些功能用的也会比较熟练,这里介绍的实践项目主要是两个:微博主页实现,天真无谐应用。

总结

本文只是介绍iOS的大体学习路线,现有一个大体上感知认识,对iOS学习有一个预热,后续会通过这几个方面详细介绍,还是那句话,代码不是看出来的,是靠手敲出来的,经验不是靠嘴说出来的,是靠手敲出来的!一定要多写代码多练习,想不会都难。

更多内容:点击这里

关注微信公众号,最新技术干货实时推送

iOS狂暴之路(开始篇)

iOS狂暴之路(开始篇)

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Stella981 Stella981
2年前
JS 苹果手机日期显示NaN问题
问题描述newDate("2019122910:30:00")在IOS下显示为NaN原因分析带的日期IOS下存在兼容问题解决方法字符串替换letdateStr"2019122910:30:00";datedateStr.repl
Easter79 Easter79
2年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
2年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
2年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
2年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
3个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这