iOS 中级面试题
2019-01-17 本文已影响17人
纳兰沫
非作者原著 来自摘抄
参考文献
什么是arc
- 在对象被创建时 retain Count +1 在对象被release时 retain Count-1 当retain
count为0时 销毁对象
- 程序中加入autoreleasepool的对象会由系统自动加上autorelease方法 如果该对象引
用计数为0 则销毁
arc创建是为了什么
MRC 内存管理的缺点
1.当我们要释放一个堆内存时 首先要确定指向这个堆空间的指针都被release(避免提前
释放)
2.释放指针指向的堆空间 首先要确定哪些指针指向同一个堆 这些指针只能释放一次(MRC
下即谁创建 谁释放 避免重复释放)
3.模块化操作时 对象可能被多个模块创建和使用 不能确定最后由谁去释放
4.多线程操作时 不确定哪个线程最后使用完毕
assign vs weak, __block vs __weak 区别
assign 适用于基本数据类型 weak适用于NSObject对象 并且是一个弱引用
assign 也可用来修饰对象 为什么不用 因为被assign修饰的对象在释放之后 指针的地
址还是存在的 也就是说指针并没有被置nil 如果后续的内存分配中 刚好分配到这块地
址 程序就会崩溃
weak修饰的对象在释放之后 指针地址会被置nil
__block 用来修饰一个变量 这个变量可以在block中被修改
__block 使用__block修饰的变量在block中会被retain(在arc下 mrc不会)
__weak 使用__weak修饰的变量不会在block代码块中被retain
__weak 避免在block出现循环引用
__block在arc和非arc下含义一样吗
不一样
在MRC中 __block variable在block中使用时不会retain的
在ARC中 __block则是会Retain的
取而代之的是用__weak或是__unsafe unretained来更精确的描述weak reference的
目的
其中前者只能在ios5之后可以使用 但是比较好
使用nonatomic 一定是线程安全的吗
不是的
atomic原子操作 系统会为setter方法加锁
nonatomic不会为setter方法加锁
atomic 线程安全 需要消耗大量系统资源来为属性加锁
nonatomic 非线程安全 适合内存较小的移动设备
+(void)load +(void)initialize 有什么用处
+load 会在类初始加载时被调用
+initialize会在第一次调用类方法或实例方法之前被调用
为什么其他语言叫函数调用 objective-c里则是给对象发消息
动态运行时语言
什么是method swizzling?
我们可以利用 method_exchangeImplementations 来交换2个方法中的IMP,
我们可以利用 class_replaceMethod 来修改类,
我们可以利用 method_setImplementation 来直接设置某个方法的IMP
UIView CALayer什么关系
- UIView 主要处理事件 frame bounds 实际上内部是访问它所含有的CALayer的相
关属性
- UIView有一个layer属性 可以返回它的主CALayer实例 UIView有一个layerClass方
法 返回主layer所使用的类 UIView的子类 可以通过重载这个方法 来让UIView使用不
同的CALayer来显示
- UIView的layer树形在系统内部 被系统维护着三份copy
1. 逻辑树 就是代码里可以操纵的 列如更改layer的属性
2. 动画树 这是一个中间层 系统正在这一层上更改属性 进行各种渲染操作
3. 显示树 这个树的内容就是当前正被显示在屏幕上的内容
- CALayer 负责绘制
loadView是干嘛用的
1、如果你用了nib文件,重载这个方法就没有太大意义。因为loadView的作用就是加载
nib。如果你重载了这个方法不调用super,那么nib文件就不会被加载。如果调用了
super,那么view已经加载完了,你需要做的其他事情在viewDidLoad里面做更合适。
2、如果你没有用nib,这个方法默认就是创建一个空的view对象。如果你想自己控制
view对象的创建,例如创建一个特殊尺寸的view,那么可以重载这个方法,自己创建一
个UIView对象,然后指定 self.view = myView; 但这种情况也没有必要调用super,
因为反正你也不需要在super方法里面创建的view对象。如果调用了super,那么就是浪
费了一些资源而已
GCD里面有哪几种Queue?你自己建立过串行queue吗?背后的线程模型是什么样的
1.主队列 dispatch_main_queue(); 串行 ,更新UI
2.全局队列 dispatch_global_queue(); 并行,四个优先级:
background,low,default,high
3.自定义队列 dispatch_queue_t queue ; 可以自定义是并行:
DISPATCH_QUEUE_CONCURRENT或者串行DISPATCH_QUEUE_SERIAL
http的post和get啥区别?
1.GET请求的数据会附在URL之后(就是把数据放置在HTTP协议头中),以?分割URL和传
输数据,参数之间以&相连,如:login.action?name=hyddd&password=idontknow&
verify=%E4%BD%A0%E5%A5%BD。如果数据是英文字母/数字,原样发送,如果是空格,
转换为+,如果是中文/其他字符,则直接把字符串用BASE64加密,得出如:
%E4%BD%A0%E5%A5%BD,其中%XX中的XX为该符号以16进制表示的ASCII。
POST把提交的数据则放置在是HTTP包的包体中。
2.”GET方式提交的数据最多只能是1024字节,理论上POST没有限制,可传较大量的数据
IIS4中最大为80KB,IIS5中为100KB”??!
以上这句是我从其他文章转过来的,其实这样说是错误的,不准确的:
(1).首先是”GET方式提交的数据最多只能是1024字节”,因为GET是通过URL提交数据,
那么GET可提交的数据量就跟URL的长度有直接关系了。而实际上,URL不存在参数上限的
问题,HTTP协议规范没有对URL长度进行限制。这个限制是特定的浏览器及服务器对它的
限制。IE对URL长度的限制是2083字节(2K+35)。对于其他浏览器,如Netscape、
FireFox等,理论上没有长度限制,其限制取决于操作系统的支持。
注意这是限制是整个URL长度,而不仅仅是你的参数值数据长度。[见参考资料5]
(2).理论上讲,POST是没有大小限制的,HTTP协议规范也没有进行大小限制,说
“POST数据量存在80K/100K的大小限制”是不准确的,POST数据是没有限制的,起限制作
用的是服务器的处理程序的处理能力。
3.在ASP中,服务端获取GET请求参数用Request.QueryString,获取POST请求参数用
Request.Form。在JSP中,用request.getParameter(\”XXXX\”)来获取,虽然jsp中
也有request.getQueryString()方法,但使用起来比较麻烦,比如:传一个test.jsp?
name=hyddd&password=hyddd,用request.getQueryString()得到的是:name=
hyddd&password=hyddd。在PHP中,可以用GET和GET和_POST分别获取GET和POST中的
数据,而REQUEST则可以获取GET和POST两种请求中的数据。值得注意的是,JSP中使用
request和PHP中使用REQUEST则可以获取GET和POST两种请求中的数据。值得注意的是,
JSP中使用request和PHP中使用_REQUEST都会有隐患,这个下次再写个文章总结。
4.POST的安全性要比GET的安全性高。注意:这里所说的安全性和上面GET提到的“安全”
不是同个概念。上面“安全”的含义仅仅是不作数据修改,而这里安全的含义是真正的
Security的含义,比如:通过GET提交数据,用户名和密码将明文出现在URL上,因为(1)
登录页面有可能被浏览器缓存,(2)其他人查看浏览器的历史纪录,那么别人就可以拿到
你的账号和密码了,除此之外,使用GET提交数据还可能会造成Cross-site request
forgery攻击。
总结一下,Get是向服务器发索取数据的一种请求,而Post是向服务器提交数据的一种
请求,在FORM(表单)中,Method默认为”GET”,实质上,GET和POST只是发送机制不同
并不是一个取一个发!