zoukankan      html  css  js  c++  java
  • iOS 面试总结 一

    iOS 开发工程师之面试总结一

    好久没有出去面试了,大概一年的时间都很稳定,最近出去面试感觉心里特别慌,没有了当时的勇气了,其实还是感觉自己的准备不是特别的充分,这是主要原因。###

    这段时间待得太安逸没了紧张感,最近一段时间感觉自己要和突飞猛进的新技术脱节了,好多之前学过的东西也生疏了,决定好好总结一下自己和写下最近面试的经验。###

    1.Object-C 是如何实现内存管理的? 常用的内存管理语句有哪些?

    Object-C 中的内存管理也就是引用计数机制。
    手动引用计数(MRC),当创建一个对象的时候系统会为这个对象的引用计数置为1,retain方法会使对象的引用计数加1,release方法会使对象的的引用计数减1,当引用计数为0时, 调用dealloc方法去销毁对象。

    自动引用计数(ARC),自动引用计数的实质还是通过引用计数机制去管理的,只不够不用我们程序员去手动管理,系统会在程序编译时自动在合适的地方添加retain、release、autorelease 方法去控制引用计数的平衡。
    内存管理的常用语句有 alloc 、retain 、release 、dealloc 、autorelease 。

    顺便提一下 内存管理严格遵循四条规则?
    1、由自己生成的对象,自己持有
    2、非自己生成的对象,自己也能持有
    3、不再需要自己持有的对象时释放
    4、非自己持有的对象无法释放

    2.浅拷贝和深拷贝的区别? 写一段深拷贝的代码。

    浅拷贝就是对内存地址的复制,让目标对象指针和源对象指向同一片内存空间.

    深拷贝就是指拷贝对象的具体内容,而内存地址是自主分配的,拷贝结束之后,两个对象虽然存的值是相同的,但是内存地址不一样,两个对象也互不影响,互不干涉。

    void testMutable()
    {
    //可变对象的复制,copy和mutableCopy都是深拷贝
    NSMutableString *str1 = [NSMutableString stringWithString:@"test"];
    NSMutableString *str2 = [str1 copy];
    //copy返回的是不可变对象,因此str2不能改变,会发生崩溃
    //[str2 appendString:@"test"];
    NSMutableString *str3 = [str1 mutableCopy];
    [str3 appendString:@"test"];
    NSLog(@"%@ %@ %@",str1,str2,str3);
    NSLog(@"%p %p %p",str1,str2,str3);
    }
    

    3.下面一点错误百出的程序,指出它有什么问题。

    typedef void(^MyBlock)(NSString *str);
    
    @interface ViewController
    
    @property(weak) MyBlock block;
    @property(nonatomic,strong) NSString *currentText;
    
    @end
    ---------------------------
    @implementation ViewController
    
    -(void)method{
    	NSString *text =@"123";
    	self.block = ^(NSString *str){
    		self.currentText = str;
    		text = str;	
    	};
    }
    @end
    
    ---------更正的代码如下--------
    typedef void(^MyBlock)(NSString *str);
    
    @interface ViewController:NSObject
    
    @property(copy) MyBlock block;
    @property(nonatomic,copy) NSString *currentText;
    
    @end
    ---------------------------
    @implementation ViewController
    
    -(void)method{
    	__block NSString *text =@"123";
    	__weak typeof(self) weakSelf = self;
    	self.block = ^(NSString *str){
    		weakSelf.currentText = str;
    		text = str;	
    	};
    }
    @end
    

    4.从名为 'employee' 的 sqlite 表中查找 'name' 属性以 'Jo' 开头的从符合结构的第100条开始10条记录,按 'updatedAt' 倒序。

    这个先不写了,我要好好看一下在贴出来。
    哈哈哈
    

    5.iOS 中常用的设计模式有哪些? Notification 和 Delegate 使用区别。

    MVC 、MVVM 、代理 、block 、KVC 、KVO 。
    Notification 和 Delegate 都可以用来传递消息。
    Delegate 是一对一的,二者要建立相互关联。
    Notification 是一对一 或 一对多的,二者不需要做相互关联。
    Delegate 的效率要比 Notification 高。

    6.tableView 的DateSource 协议有哪些方法必须要实现,怎么进行性能优化?

    (1)numberOfSectionsInTableView: //可写可不写(当一个分区的时可不写)
    (2)tableView:numberOfRowsInSecion:
    (3)tableView:cellForRowAtIndexPath:
    优化问题:
    (1):网络请求成功后进入后台进行布局计算并返回高度缓冲备用。
    (2):当cell的subview较多时尤其是图片的时候建议用其drawRect:中自行绘制。
    (3):透明的问题,将UI元素的透明度设置成不透明的。
    

    7.iOS 中的多线程实现有哪些,对你了解最深入的说说你的理解。

    1、NSThread
    2、NSOperation
    3、Grand Central Dispatch (GCD)

    1、使用线程可以把程序中占据时间长的任务放到后台去处理,如图片、视频的下载。
    2、发挥多核处理器的优势,并发执行让系统运行的更快、更流畅,用户体验更好。
    3、能适当提高执行效率,提高资源利用率。
    4、创建线程是有开销的,大量开启的话,会降低性能;程序设计也会更复杂,比如线程之间的通信,多线程的数据共享。
    5.GCD会自动管理线程的生命周期(创建线程,调度任务,销毁线程),不需要我们编写任何管理线程的代码。
    6.http://blog.sina.com.cn/s/blog_99c943d00102wphm.html

  • 相关阅读:
    Tomcat与Spring中的事件机制详解
    Kafka消息系统基础知识索引
    配置SpringBoot-从日志系统配置说起
    支付宝手机网页支付和微信公众号支付接入
    centos下搭建YII环境
    为什么需要 Stream
    基于Django的Rest Framework框架的序列化组件
    基于Django的Rest Framework框架的RESTful规范研究
    web中状态码301和302的区别
    Django初见
  • 原文地址:https://www.cnblogs.com/ting-miao/p/5847138.html
Copyright © 2011-2022 走看看