IOS

作者: Tommmmm | 来源:发表于2018-09-06 23:10 被阅读0次

一、IOS基础

1、浅拷贝与深拷贝
浅拷贝:拷贝对象的指针成员变量和原对象的指针成员变量指向同一块内存空间。
深拷贝:拷贝对象的指针成员变量和原对象的指针成员变量分别指向两块不同的内存空间。

NSString *bbb = @”dddd";
NSString *stringCopy = [bbb copy];//浅拷贝
NSMutableString *stringDCopy = [bbb mutableCopy];//深拷贝

2、手写Set与Get方法

-(void) setName:(NSString) name;
-(NSString)getName;
@property (nonatomic, assign) NSInteger age;

3、

二、多线程GCD


1、同步与异步:
同步:多个任务情况下,一个任务A执行结束,才可以执行另一个任务B。只存在一个线程也就是主线程。
异步:多个任务情况下,一个任务A正在执行,同时可以执行另一个任务B。任务B不用等待任务A结束才执行。存在多条线程。

2、并行与并发
并行:指两个或多个时间在同一时刻发生。多核CPU同时开启多条线程供多个任务同时执行,互不干扰。

并发:两个或多个事件在同一时间间隔内发生。看上去就好像一个CPU能够并且执行多个线程一样。其实是伪异步

3、多线程的问题
多个线程更新相同的资源会导致数据的不一致[数据竞争],停止等待时间的线程会导致多个线程相互持续等待[死锁],使用太多线程会消耗大量内存。
NSThread;
GCD:旨在替代NSThread等线程技术

多线程的原理:
同一时间,CPU只能处理1条线程,只有1条线程在工作
多线程并发执行,其实是CPU快速地在多条线程之间调度

线程同步和异步的区别?
异步:举个简单的例子 就是游戏,游戏会有图像和背景音乐
同步:是指一个线程要等待上一个线程执行完之后才开始执行当前的线程

4、GCD
开发者要做的只是定义想执行的任务并追加到适当的Dispatch Queue中。
Dispatch Queue是执行处理的等待队列,采用 FIFO(先进先出)的原则。
在 GCD 中有两种队列:串行队列和并发队列。串行队列每次只有一个任务被执行。让任务一个接着一个地执行。(只开启一个线程,一个任务执行完毕后,再执行下一个任务)

并发队列可以让多个任务并发执行。(可以开启多个线程,并且同时执行任务)

三、iOS启动流程

UIApplication对象就代表一个应用程序。
一个iOS程序启动后创建的第一个对象就是UIApplication对象,且只有一个。

app很容易受到打扰。比如一个来电或者锁屏会导致app进入后台甚至被终止。这时UIApplication会通知它的delegate对象,让delegate代理来处理这些系统事件。

main函数中执行了一个UIApplicationMain这个函数

intUIApplicationMain(int argc, char *argv[], NSString *principalClassName, NSString *delegateClassName);

UIApplicationMain函数会根据principalClassName创建UIApplication对象,根据delegateClassName创建一个delegate对象,并将该delegate对象赋值给UIApplication对象中的delegate属性。
接着会建立应用程序的Main Runloop(事件循环)。

流程:
1.main函数

2.UIApplicationMain

  • 创建UIApplication对象
  • 创建UIApplication的delegate对象

3.delegate对象开始处理(监听)系统事件(没有storyboard)

  • 程序启动完毕的时候, 就会调用代理的application:didFinishLaunchingWithOptions:方法

  • 在application:didFinishLaunchingWithOptions:中创建UIWindow

  • 创建和设置UIWindow的rootViewController

  • 显示窗口

3.根据Info.plist获得最主要storyboard的文件名,加载最主要的storyboard(有storyboard)

  • 创建UIWindow
  • 创建和设置UIWindow的rootViewController
  • 显示窗口

四、ViewController载入过程

五、core data

1、what
Core Data是iOS5之后才出现的一个框架,它提供了对象-关系映射(ORM)的功能,即能够将OC对象转化成数据,保存在SQLite数据库文件中,也能够将保存在数据库中的数据还原成OC对象。


利用Core Data框架,我们就可以轻松地将数据库里面的2条记录转换成2个OC对象,也可以轻松地将2个OC对象保存到数据库中,变成2条表记录,而且不用写一条SQL语句。

2、NSManagedObject
通过Core Data从数据库取出的对象,默认情况下都是NSManagedObject对象。
通过键-值对来存取所有的实体属性
1> setValue:forKey:存储属性值(属性名为key)
2> valueForKey:获取属性值(属性名为key)

六、iOS中内存管理


五块区域

七、 MVC 和 MVVM 的区别,以及各自的优缺点。


MVC

用户操作->View(负责接收用户的输入操作)->Controller(业务逻辑处理)->Model(数据持久化)->View(将结果反馈给View)。
MVC使用非常广泛,比如JavaEE中的SSH框架(Struts/Spring/Hibernate)

MVVM(Model-View-ViewModel):MVVM是一种思想、一种模式

MVVM
在View和Model之间没有联系,通过ViewModel进行交互,而且Model和ViewModel之间的交互是双向的
因此视图的数据的变化会同时修改数据源,而数据源数据的变化也会立即反应到View上

MVP:

八、为什么代理要用weak?
使用weak是为了避免循环引用

block和代理的区别?

九、ARC: Automatic Reference Counting
ARC自动引用计数.
这一机制使得开发者无需键入 retain 和 release , 这不仅能够降低程序崩溃和内存泄露的风险。

ARC几个要点:
在对象被创建时 retain count +1,在对象被release时 retain count -1.当retain count 为0 时,销毁对象。
程序中加入autoreleasepool的对象会自动加上autorelease方法,如果该对象引用计数为0,则销毁。

MRC:手动内存管理
当调用对象的retain方法时候计数器+1
当给对象发送一条release消息的时候,计数器-1

delegate 是代理,就是我不想做的事情交给别人做。只需要调用delegate就可以了,由其他类完成所需要的操作。所以delegate是一对一关系。

十、loadView
1.什么时候被调用?
每次访问UIViewController的view而且view为nil,loadView方法就会被调用。

2.有什么作用?
loadView方法是用来负责创建UIViewController的view

相关文章

网友评论

      本文标题:IOS

      本文链接:https://www.haomeiwen.com/subject/cptjkftx.html