美文网首页面试题
iOS 中级面试题

iOS 中级面试题

作者: 纳兰沫 | 来源:发表于2019-01-17 16:39 被阅读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只是发送机制不同
    并不是一个取一个发!
    

    相关文章

      网友评论

        本文标题:iOS 中级面试题

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