【ios开发】知识简介和关键函数的分析

Xcode开发界面包括5个主要区域:

工具栏(ToolBar):主要负责程序运行调试,编辑器功能区域的显示/隐藏;
编辑区(Editor Area):代码编写区域;
导航区(Navigator Area):展示工程文件列表
调试区(Debug Area):在进行程序调试中,可以查看对象信息,并且输入日志;
公共区(Utilities Area):用于设置对象属性,添加UI控件等。

接下来分析工程目录:
图界面中左侧有很多的文件夹,大致了解一些这些文件夹的作用:
外侧的四个大文件夹:
1. Products: 主要用于mac电脑开发,IOS开发用不到。
2. MyFirstAppTests: 用于单元测试。
3. MyFirstAppUITests: 用于UI测试。
3. MyFirstApp: IOS开发的内容主要都是存放在这个文件夹中。
MyFirstApp这个文件夹又包含:
3.1 AppDelegate.swift:代表应用程序,App初始化需要的内容都在这里做,App是从这里开始启动的,这个文件暂时不做深入。

3.2 ViewController.swift: 这是IOS视图控制器,其实说白了就是一个页面的容器,我们编写UI代码都要写在这个容器里,这是本节重点关注的文件。

3.3 Main.storyboard: storyboard文件可以帮助我们用比较直观的方式来快速的开发UI,通过这个文件我们可以看到我们设计的页面长什么样子。比如,我们要在页面上添加一张图片,我们只要将一个图片的控件直接拉到storyboard上,就可以看到这个图片在页面上到底是大是小,位置在哪里等等。这是IOS推荐的UI开发模式。

而视图中的三项:
mport UIKit:UIKit是IOS提供给我们专门用于编写UI代码的库,import是导入的意思,导入UIKit这个库后就可以在后续代码中用其提供的类来写UI。以后要使用第三方提供的库,类似也要这么导入。

ViewController:UIKit库中一个重要的类,顾名思义“视图控制器”。可以先这么认为吧,一个ViewController代表一个页面的容器。也就是一个页面对应一个ViewController。所以很明显,我们的UI代码应该写在ViewController类里面。

viewDidLoad(): 这是UIViewController中的一个方法,代表页面已经初始化完毕,这时页面还是空白的,可以往页面中添加其他的UI元素了,比如图片、文字。我们要添加的UI代码都是写在红色箭头所指的地方。每个页面都有一个完整的生命周期,从它开始被创建一直到它被销毁回收。

二、技术层面学习

1.使用Xcode搭建可视化界面
Xcode提供了两种可视化搭建界面的方法,即storyBoard以及xib:

1.1StoryBoard:扩展名为.storyboard的文件,一般包含多个控制器,以及描述控制器之间如何进行跳转的。从字面意思上理解,即:通过故事板能够看出一款app是如何设计界面的。
xib:扩展名为.xib的文件,一般用于展示单个视图(view);
在实际的开发过程中,一般需要把两种方式结合起来使用,App应用的整体框架,特别是涉及到控制器之间跳转的,建议使用StoryBoard;对于控制器中特定的视图(view),一般采用xib的方式来创建,在实际编码过程中,会手工通过代码方式添加xib到某个控制器中。

1.2使用Storyboard创建界面
根据示例程序,在界面中一共包含两个UI控件,即:
UIImageView:用于显示一张图片;
UIButton:用于点击,当点击时,图片会自动显示。
如下图,在Storyboard中,查找出UIButton和UIImageView控件,并用鼠标按住后,拖动到视图控制器中,并在右侧的公共区中设置控件的属性。其中,对于UIButton可以更新其显示的按钮提示文字。

1.3连线–建立界面与代码之间的联系
当搭建完毕UI界面后,如何把界面中的UI控件与代码逻辑进行关联?
Xcode中提供了连线操作,通过连线操作,可以为控制器添加属性,以及点击方法选中工具栏中的“show assistant editor” 并选中UIImageView,按住control键,然后拖动连线到viewController.m文件中的如下位置,即为控制器添加一个属性(IBOutlet);

1.3添加图片资源文件
APP中使用到的一些图片资源,可以手工添加到工程文件中的Assets文件夹中。将如下资源放入Assets文件中:
1.App的icon;
2.App的启动页图片
3.App中界面使用的静态图片,如按钮、底部Tabbar图片等;动态图片不建议放在Assets文件夹中。

三、数据库和数据持久化

1.0 Swift3.0学习

1.访问修饰符:
private:修饰的属性和方法只能被本类(结构体)访问。修饰类(结构体)本身时,经过实验,效果和fileprivate相同,文件内部可见。
fileprivate:文件内部可见
internal:整个框架、模块内可见
public:公开,但其它框架、模块中不可被重写或继承
open:公开,且无限制

2.结构体与类相关知识点:
(1)结构体是值类型,类是引用类型
(2)当类是let时,可修改其属性,但结构体是let时,其属性也不可被修改(结构体是值类型,修改其属性,会导致新副本的产生,与let相悖)
(3)结构体中的方法要修改自身属性时,要加mutating关键字修饰(结构体是值类型,修改其属性,会导致新副本的产生,所以要加mutating告知编译器处理)
(4)Array Dict Set Int Float Bool String Double等都是结构体
(5)结构体不具备继承特性

3.单例的实现:
在swift中实现单例模式十分简单,只需静态变量+私有初始化方法即可。swift在执行时静态变量初始化时,会自动加入dispatch_once机制保证多线程访问情况下的安全。

4.get、set、didSet
swift中存在计算属性的概念,计算属性本身不具备存储能力,如果实现了一个属性的get(set)方法,该属性就指定为了计算属性。如果想控制一个属性的存取方法,同时又希望属性本身具有储值能力,则需要声明一个存储型变量,再通过计算变量对其进行控制。
如果只想控制属性的存储,则不用这么麻烦,直接实现didSet方法即可。

5.关于init函数
为了保证安全性,swift对初始化函数有着很多严格的要求,对象(self)在使用前编译器会严格检查所有的成员变量的初始化情况,在所有成员变量被初始化前对象是不可被访问的。进行初始化的过程中需要实现回调闭包或者指定target及selector,这样就会不可避免的会访问到self,但此时编译器便会报错,我们在所有成员变量尚未初始化(timer正在初始化中)便访问了self。
解决的方式是private var cleanMemoryTimer:Timer!
告知编译器,承诺cleanMemoryTimer在使用时一定是存在初始值的,这样编译器就不会再对cleanMemoryTimer的初始化情况进行检查,其它变量完成初始化后,对象(self)就可以使用了。

6.weak与unowned
swift与oc一样,采用基于引用计数的内存管理机制,同样也存在强弱引用的概念,在oc中我们通过weak描述一个弱引用关系,在swift中同样也有weak,它们的作用也完全一致,weak修饰的指针指向的对象被销毁后,该指针会被置为nil.但是,swift中引入了可选型的概念,同时还存在var与let的区别。如果一个对象要被赋值为nil,则必须为可选型,同时从指向一个对象到被置为nil,有一个变化过程,所以又必需是一个var,于是就要求weak修饰的是必须是一个可选型var(当用weak修饰一个变量时,这个变量自动就会被声明为可选型)。但有些情况下,我们想修饰一个弱引用关系,但是设计上被修饰的指针不是一个可选型或者不是一个var(变量),这个时候就可以用unowned对其进行描述,unowned同样描述一个弱引用关系,但不具备自动置空(nil)的能力,于是也就没有了可选型及var的要求。不过在使用unowned时要格外小心,避免出现野指针问题。

7.闭包中为什么要加self的问题和解决
在同一个类内部,当我们想要访问类的其它成员变量或方法时只需直接调用即可,但即便是在类内部,如果我们在一个闭包中去直接访问成员变量或方法,编译器是会报错的。编译器会提示我们要加上self.进行访问。原因还是因为swift十分注重代码的安全性,闭包可能会导致循环引用问题的产生,如果让开发者隐去self.的书写,很可能导致开发者忽略到可能产生的循环引用问题(这个在oc中是很容易发生的),所以编译器要求在闭包中必需通过加self.对成员变量或方法进行访问。但是具体是否真的会产生循环引用,是否需要用weak(unowned)修饰,则需要自己视情况把握。

四、何为MVC?

MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。MVC被独特的发展起来用于映射传统的输入、处理和输出功能在一个逻辑的图形化用户界面的结构中。
Model(模型)是应用程序中用于处理应用程序数据逻辑的部分。
View(视图)是应用程序中处理数据显示的部分。
Controller(控制器)是应用程序中处理用户交互的部分。
在综合设计中,我的UIViewController更多的是作为一个需求场景,而需求场景——根据需求对各个模块进行配置和负责UI布局,让各个模块去做自己的事。每个模块的展示和交互都由它自己对应的MVC去完成。需求场景只要做一些强相关的业务逻辑即可。
在 MVC 模式中 view 将用户交互通知给控制器。view 的控制器通过更新 Model 来反应状态的改变。Model(通常使用 Key-Value-Observation)通知控制器来更新他们负责的 view。大多数 iOS 应用程序的代码使用这种方式来组织。
在Swift中,根据需要使用的数据创建数 Modal 数据模型属性变量,创建 Cell 视图赋值方法,从 Modal 数据模型中取出数据更新 View 的内容,从 Modal 数据模型中取出数据更新 View 的内容。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值