iOS经典面试题

1、什么时候用delegate,什么时候用Notification?

Delegate(委托模式):1对1的反向消息通知功能。

Notification(通知模式):只想要把消息发送出去,告知某些状态的变化。但是并不关心谁想要知道这个。

2、什么是 KVO 和 KVC?

1). KVC(Key-Value-Coding):键值编码 是一种通过字符串间接访问对象的方式(即给属性赋值)    举例说明:    stu.name =@"张三"// 点语法给属性赋值[stu setValue:@"张三"forKey:@"name"];// 通过字符串使用KVC方式给属性赋值stu1.nameLabel.text =@"张三";    [stu1 setValue:@"张三"forKey:@"nameLabel.text"];// 跨层赋值2). KVO(key-Value-Observing):键值观察机制 他提供了观察某一属性变化的方法,极大的简化了代码。    KVO只能被KVC触发,包括使用setValue:forKey:方法和点语法。// 通过下方方法为属性添加KVO观察- (void)addObserver:(NSObject*)observer                    forKeyPath:(NSString*)keyPath                    options:(NSKeyValueObservingOptions)options                    context:(nullablevoid*)context;// 当被观察的属性发送变化时,会自动触发下方方法                  - (void)observeValueForKeyPath:(NSString*)keyPath                              ofObject:(id)object                                  change:(NSDictionary*)change                                context:(void*)context{}    KVC 和 KVO 的 keyPath 可以是属性、实例变量、成员变量。

3、KVC的底层实现?

当一个对象调用setValue方法时,方法内部会做以下操作:1). 检查是否存在相应的key的set方法,如果存在,就调用set方法。2). 如果set方法不存在,就会查找与key相同名称并且带下划线的成员变量,如果有,则直接给成员变量属性赋值。3). 如果没有找到_key,就会查找相同名称的属性key,如果有就直接赋值。4). 如果还没有找到,则调用valueForUndefinedKey:和setValue:forUndefinedKey:方法。这些方法的默认实现都是抛出异常,我们可以根据需要重写它们。

4、KVO的底层实现?

KVO基于runtime机制实现。

5、ViewController生命周期

按照执行顺序排列:1.initWithCoder:通过nib文件初始化时触发。2.awakeFromNib:nib文件被加载的时候,会发生一个awakeFromNib的消息到nib文件中的每个对象。3.loadView:开始加载视图控制器自带的view。4.viewDidLoad:视图控制器的view被加载完成。5.viewWillAppear:视图控制器的view将要显示在window上。6.updateViewConstraints:视图控制器的view开始更新AutoLayout约束。7.viewWillLayoutSubviews:视图控制器的view将要更新内容视图的位置。8.viewDidLayoutSubviews:视图控制器的view已经更新视图的位置。9.viewDidAppear:视图控制器的view已经展示到window上。10.viewWillDisappear:视图控制器的view将要从window上消失。11.viewDidDisappear:视图控制器的view已经从window上消失。

6、方法和选择器有何不同?

selector是一个方法的名字,方法是一个组合体,包含了名字和实现。

7、你是否接触过OC中的反射机制?简单聊一下概念和使用

1).class反射    通过类名的字符串形式实例化对象。        Classclass=NSClassFromString(@"student");        Student *stu = [[classalloc] init];    将类名变为字符串。        Classclass=[Studentclass];NSString*className =NSStringFromClass(class);2). SEL的反射    通过方法的字符串形式实例化方法。        SEL selector =NSSelectorFromString(@"setName");          [stu performSelector:selector withObject:@"Mike"];    将方法变成字符串。NSStringFromSelector(@selector*(setName:));

8、调用方法有两种方式:

1). 直接通过方法名来调用。[person show];2). 间接的通过SEL数据来调用 SEL aaa =@selector(show); [person performSelector:aaa];

9、如何对iOS设备进行性能测试?

答: Profile-> Instruments ->Time Profiler

10、开发项目时你是怎么检查内存泄露?

1). 静态分析 analyze。

2). instruments工具里面有个leak可以动态分析。

11、什么是懒加载?

答:懒加载就是只在用到的时候才去初始化。也可以理解成延时加载。

我觉得最好也最简单的一个例子就是tableView中图片的加载显示了, 一个延时加载, 避免内存过高,一个异步加载,避免线程堵塞提高用户体验。

12、类变量的 @public,@protected,@private,@package 声明各有什么含义?

@public任何地方都能访问;@protected该类和子类中访问,是默认的;@private只能在本类中访问;@package本包内使用,跨包不可以。

13、什么是谓词?

谓词就是通过NSPredicate给定的逻辑条件作为约束条件,完成对数据的筛选。//定义谓词对象,谓词对象中包含了过滤条件(过滤条件比较多)NSPredicate*predicate = [NSPredicatepredicateWithFormat:@"age<%d",30];//使用谓词条件过滤数组中的元素,过滤之后返回查询的结果NSArray*array = [persons filteredArrayUsingPredicate:predicate];

14、isa指针问题

isa:是一个Class 类型的指针.

每个实例对象有个isa的指针,他指向对象的类,而Class里也有个isa的指针, 指向meteClass(元类)。

元类保存了类方法的列表。

当类方法被调用时,先会从本身查找类方法的实现,如果没有,元类会向他父类查找该方法。

同时注意的是:元类(meteClass)也是类,它也是对象。

元类也有isa指针,它的isa指针最终指向的是一个根元类(root meteClass)。

根元类的isa指针指向本身,这样形成了一个封闭的内循环。

15、如何访问并修改一个类的私有属性?

1). 一种是通过KVC获取。

2). 通过runtime访问并修改私有属性。

16、一个objc对象的isa的指针指向什么?有什么作用?

答:指向他的类对象,从而可以找到对象上的方法。

17、下面的代码输出什么?

@implementationSon:Father- (id)init {if(self= [superinit]) {NSLog(@"%@",NSStringFromClass([selfclass]));// SonNSLog(@"%@",NSStringFromClass([superclass]));// Son}returnself;}@end// 解析:self是类的隐藏参数,指向当前调用方法的这个类的实例。super是一个Magic Keyword,它本质是一个编译器标示符,和self是指向的同一个消息接收者。不同的是:super会告诉编译器,调用class这个方法时,要去父类的方法,而不是本类里的。上面的例子不管调用[selfclass]还是[superclass],接受消息的对象都是当前 Son *obj 这个对象。

18、写一个完整的代理,包括声明、实现

// 创建@protocolMyDelagate@required-(void)eat:(NSString*)foodName;@optional-(void)run;@end//  声明 .h@interfaceperson:NSObject@end//  实现 .m@implementationperson- (void)eat:(NSString*)foodName {NSLog(@"吃:%@!", foodName);} - (void)run {NSLog(@"run!");}@end

19、isKindOfClass、isMemberOfClass、selector作用分别是什么

isKindOfClass:作用是某个对象属于某个类型或者继承自某类型。

isMemberOfClass:某个对象确切属于某个类型。

selector:通过方法名,获取在内存中的函数的入口地址。

20、delegate 和 notification 的区别

1). 二者都用于传递消息,不同之处主要在于一个是一对一的,另一个是一对多的。2). notification通过维护一个array,实现一对多消息的转发。3). delegate需要两者之间必须建立联系,不然没法调用代理的方法;notification不需要两者之间有联系。45、什么是block?闭包(block):闭包就是获取其它函数局部变量的匿名函数。

21、block反向传值

在控制器间传值可以使用代理或者block,使用block相对来说简洁。在前一个控制器的touchesBegan:方法内实现如下代码。// OneViewController.mTwoViewController *twoVC = [[TwoViewController alloc] init];  twoVC.valueBlcok = ^(NSString*str) {NSLog(@"OneViewController拿到值:%@", str);  };  [selfpresentViewController:twoVC animated:YEScompletion:nil];// TwoViewController.h  (在.h文件中声明一个block属性)@property(nonatomic,strong)void(^valueBlcok)(NSString*str);// TwoViewController.m  (在.m文件中实现方法)- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent*)event {// 传值:调用blockif(_valueBlcok) {        _valueBlcok(@"123456");    }}

22、block的注意点

1). 在block内部使用外部指针且会造成循环引用情况下,需要用__week修饰外部指针:    __weaktypeof(self) weakSelf =self;2). 在block内部如果调用了延时函数还使用弱指针会取不到该指针,因为已经被销毁了,需要在block内部再将弱指针重新强引用一下。    __strongtypeof(self) strongSelf = weakSelf;3). 如果需要在block内部改变外部栈区变量的话,需要在用__block修饰外部变量。

23、BAD_ACCESS在什么情况下出现?

答:这种问题在开发时经常遇到。原因是访问了野指针,比如访问已经释放对象的成员变量或者发消息、死循环等。

24、lldb(gdb)常用的控制台调试命令?

1). p 输出基本类型。是打印命令,需要指定类型。是print的简写    p (int)[[[selfview] subviews] count]2). po 打印对象,会调用对象description方法。是print-object的简写    po [selfview]3). expr 可以在调试时动态执行指定表达式,并将结果打印出来。常用于在调试过程中修改变量的值。4). bt:打印调用堆栈,是thread backtrace的简写,加all可打印所有thread的堆栈5). br l:是breakpointlist的简写

25、你一般是怎么用Instruments的?

Instruments里面工具很多,常用:

1). Time Profiler: 性能分析

2). Zombies:检查是否访问了僵尸对象,但是这个工具只能从上往下检查,不智能。

3). Allocations:用来检查内存,写算法的那批人也用这个来检查。

4). Leaks:检查内存,看是否有内存泄露。

26、iOS中常用的数据存储方式有哪些?

数据存储有四种方案:NSUserDefault、KeyChain、file、DB。    其中File有三种方式:plist、Archive(归档)    DB包括:SQLite、FMDB、CoreData

27、iOS的沙盒目录结构是怎样的?

沙盒结构:

1). Application:存放程序源文件,上架前经过数字签名,上架后不可修改。

2). Documents:常用目录,iCloud备份目录,存放数据。(这里不能存缓存文件,否则上架不被通过)

3). Library:

        Caches:存放体积大又不需要备份的数据。(常用的缓存路径)

        Preference:设置目录,iCloud会备份设置信息。

4). tmp:存放临时文件,不会被备份,而且这个文件下的数据有可能随时被清除的可能。

28、iOS多线程技术有哪几种方式?

答:pthread、NSThread、GCD、NSOperation

29、GCD 与 NSOperation 的区别:

GCD 和NSOperation都是用于实现多线程:    GCD 基于C语言的底层API,GCD主要与block结合使用,代码简洁高效。NSOperation属于Objective-C类,是基于GCD更高一层的封装。复杂任务一般用NSOperation实现。

30、写出使用GCD方式从子线程回到主线程的方法代码

答:dispatch_async(dispatch_get_main_queue(), ^{ });

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,457评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,837评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,696评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,183评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,057评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,105评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,520评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,211评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,482评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,574评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,353评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,897评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,489评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,683评论 2 335

推荐阅读更多精彩内容

  • 1.ios高性能编程 (1).内层 最小的内层平均值和峰值(2).耗电量 高效的算法和数据结构(3).初始化时...
    欧辰_OSR阅读 29,242评论 8 265
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,067评论 1 32
  • 1.设计模式是什么? 你知道哪些设计模式,并简要叙述? 设计模式是一种编码经验,就是用比较成熟的逻辑去处理某一种类...
    司马DE晴空阅读 1,269评论 0 7
  • 设计模式是什么? 你知道哪些设计模式,并简要叙述? 设计模式是一种编码经验,就是用比较成熟的逻辑去处理某一种类型的...
    卑微的戏子阅读 618评论 0 1
  • 规划放很久刚刚好搞活经济局 与复古
    新一小编阅读 197评论 0 0