1、为什么说Objective-C是一门动态的语言
靜态、动态是相对的,这里动态语言指的是不需要在编译时确定所有的东西在应用显示停止运行怎么办时还可以动态的添加变量、方法囷类。
Objective-C 可以通过Runtime 这个应用显示停止运行怎么办时机制在应用显示停止运行怎么办时动态的添加变量、方法、类等,所以说Objective-C 是一门动态的語言
1)weak:指明该对象并不负责保持delegate这个对象,delegate这个对象的销毁由外部控制
2)--- delegate是委托的意思,在oc中则是一个类委托另一个类实现某个方法当一个对象接受到某个事件或者通知的时候, 会向它的Delegate对象查询它是否能够响应这个事件或者通知如果可以这个对象就会给它的Delegate对象發送一个消息(执行一个方法调用)。
---- datasource字面是数据源一般和Delegate伴生,这时数据源处理的数据就是Delegate中发送委托的类中的数据并通过Datasource发送给接受委托的类。
delegate应用显示停止运行怎么办成本低block的应用显示停止运行怎么办成本高。block出栈需要将使用的数据从栈内存拷贝到堆内存当嘫对象的话就是加计数,使用完或者block置nil后才消除delegate只是保存了一个对象指针,直接回调没有额外消耗。就像C的函数指针只多做了一个查表动作。
b、从使用场景区别block和delegate:有多个相关方法假如每个方法都设置一个 block, 这样会更麻烦。而 delegate 让多个方法分成一组只需要设置一次,僦可以多次回调当多于 3 个方法时就应该优先采用 delegate。当12个回调时,则使用block
delegate更安全些,比如: 避免循环引用使用 block 时稍微不注意就形成循環引用,导致对象释放不了这种循环引用,一旦出现就比较难检查出来而 delegate 的方法是分离开的,并不会引用上下文因此会更安全些。
咜们之前更多区别可以看
4、属性的实质是什么包括哪几个部分?属性默认的关键字都有哪些@dynamic关键字和@synthesize关键字是用来做什么的?
5、属性嘚默认关键字是什么
6、NSString为什么要用copy关键字,如果用strong会有什么问题
1)因为父类指针可以指向子类对象,使用copy的目的是为了让本对象的属性不受外界影响,使用copy无论给我传入是一个可变对象还是不可对象,我本身持有的就是一个不可变的副本。
2)使用是strong,那么这个属性就有可能指向一個可变对象,如果这个可变对象在外部被修改了,那么会影响该属性
-----------copy此特质所表达的所属关系与strong类似。然而设置方法并不保留新值而是将其“拷贝” (copy)。
当属性类型为NSString时经常用此特质来保护其封装性,因为传递给设置方法的新值有可能指向一个NSMutableString类的实例这个类是NSString的子类,表示一种可修改其值的字符串此时若是不拷贝字符串,那么设置完属性之后字符串的值就可能会在对象不知情的情况下遭人更改。所鉯这时就要拷贝一份“不可变”
(immutable)的字符串,确保对象中的字符串值不会无意间变动只要实现属性所用的对象是“可变的” (mutable),就应该在設置新属性值时拷贝一份
7、如何令自己所写的对象具有拷贝功能:若想令自己所写的对象具有拷贝功能,则需实现 NSCopying 协议如果自定义的對象分为可变版本与不可变版本,那么就要同时实现 NSCopying与 NSMutableCopying协议
8、可变集合类 和 不可变集合类的 copy 和 mutablecopy有什么区别?如果是集合是内容复制的话集合里面的元素也是内容复制么?
1)使用copy时 可变集合的指针地址以及内存地址都不相同 是深复制 不可变集合的指针地址不一样但是内存哋址一样 属于浅复制使用mutableCopy的时候无论是可变集合还是不可变集合的指针地址和内存地址都不同 都属于深复制。
因为既然有外链那么视图茬xib或者storyboard中肯定存在视图已经对它有一个强引用了。
10、nonatomic和atomic的区别atomic是绝对的线程安全么?为什么如果不是,那应该如何实现
对于atomic的属性,系统生成的getter和setter会保证getset的操作完整性,不受其他线程影响比如线程A的getter方法应用显示停止运行怎么办到一半,线程B调用了setter那么线程A嘚getter还是能得到一个完整的对象。而nonatomic就没有这个保证了所以速度要比atomic快。
2)atomic可不能保证线程安全如果线程A调用了getter,与此同时线程B和线程C嘟调了setter那最后线程Aget到的值,三种都有可能:可能是BC set之前原始的值,也可能是B set的值也可能是C set的值。同时这个最终的值也可能是B set的值,也可能是C set的值要保证安全,可以使用线程锁
12、用StoryBoard开发界面有什么弊端?如何避免
用StoryBoard开发界面难以维护,如果需要改动全局的一个芓体如果是代码的话就很好办,pch或头文件中改动就好了如果是storyboard中就需要一个一个改动很麻烦。如果storyboard中scene太多打开storyboard会比较慢。错误定位仳较困难好多错误提示模棱两可。故大型项目时候还是采用代码比较好
13、进程和线程的区别同步异步的区别?并行和并发的区别
1)進程是一个内存中应用显示停止运行怎么办的应用程序,比如在Windows系统中一个应用显示停止运行怎么办的exe就是一个进程。线程是指进程中嘚一个执行流程
2)同步是顺序执行,执行完一个再执行下一个需要等待,协调应用显示停止运行怎么办异步就是彼此独立,在等待某事件的过程中继续做自己的事不需要等待这些事件完成后再工作。
3)并发性(Concurrence):指两个或两个以上的事件或活动在同一时间间隔内發生并发的实质是一个物理CPU(也可以多个物理CPU) 在若干道程序之间多路复用,并发性是对有限物理资源强制行使多用户共享以提高效率
并荇性(parallelism)指两个或两个以上事件或活动在同一时刻发生。在多道程序环境下并行性使多个程序同一时刻可在不同CPU上同时执行。通俗一点並行和并发 是前者相当于三个人同时吃一个馒头后者相当于一个人同时吃三个馒头。
区别:(并发)一个处理器同时处理多个任务和(并行)多个处理器或者是多核的处理器同时处理多个不同的任务
15、GCD的一些常用的函数?(groupbarrier,信号量线程同步)
16、如何使用队列来避免资源抢夺?
dispatch_barrior_async 作用是在并行队列中等待前面两个操作并行操作完成。
17、数据持久化的几个方案
18、说一下AppDelegate的几个方法从后台到前台调用了哪些方法?第一次启动调用了哪些方法从前台到后台调用了哪些方法?
1).当程序第一次应用显示停止运行怎么办并且将要显示窗口的时候執行在该方法中我们完成的操作
NSCache中存储的对象也不必实现NSCoding协议,因为毕竟是临时存储类似于内存缓存,程序退出后就被释放了
2).description方法默认返回对象的描述信息(默认实现是返回类名和对象的内存地址)
3).description方法是基类NSObject 所带的方法,因为其默认实现是返回类名和对象的内存地址, 這样的话,使用NSLog输出OC对象,意义就不是很大,因为我们并不关心对象的内存地址,比较关心的是对象内部的一些成变量的值。因此,会经常重写description方法,覆盖description方法的默认实现
22、objc使用什么机制管理对象内存?
通过 retainCount 的机制来决定对象是否需要释放 每次 runloop 的时候,都会检查对象的 retainCount如果retainCount 为 0,说奣该对象没有地方需要继续使用了可以释放掉了。
23、block的实质是什么一共有几种block?都是什么情况下生成的
1)Block是“带有自动变量值的匿洺函数”。block对象就是一个结构体里面有isa指针指向自己的类(global malloc stack),有desc结构体描述block的信息forwarding指向自己或堆上自己的地址,如果block对象截获变量这些变量也会出现在block结构体中。最重要的block结构体有一个函数指针指向block代码块。
2)block结构体的构造函数的参数包括函数指针,描述block的结構体自动截获的变量(全局变量不用截获),引用到的block变量(block对象也会转变成结构体).
3)block代码块在编译的时候会生成一个函数,函数第一个參数是前面说到的block对象结构体指针执行block,相当于执行block里面forwarding里面的函数指针
24、为什么在默认情况下无法修改被block捕获的变量? __block都做了什么
1)当声明与实现一个Block时,创建的闭包会捕获在它的域中的任何涉及的变量通过在内存中持有他们,能够在block的实现中对其进行访问在默认情况下,任何在block的域中被捕获的变量都不能被修改除非这个变量已被给予了__block的标志。
2)例如:__block int addtional = 5;当block捕获了一个对象时它会对其进行retain操作,并在block代码执行完毕完release对象这样才能保证在block执行过程中,对象不会因引用计数为0而被释放掉block本身就是一个对象,它对其他对象的引用与一般的对象引用类似都是需要对引用对象进行retain与release。