今日头条iOS高级工程时面试记录 提升自己面试知识

一、自我介绍

简单介绍一下你自己吧

解析:简单介绍下自己的名字,教育背景,现在的工作,做过的项目

二、自我介绍衍生的口头问题

讲讲下你在你项目中做过的优化或者技术难点

解析:介绍了自己封装的一个集picker,文本域的灵活展开的表视图。这个视图的数据源是json,怎么转成模型数组的?这个cell有哪些类型?展示的怎么区分这些cell?这里面有用过复用机制吗?这些cell有实现过多重继承吗?

题外话:这种问题最好各人自己找问题讲讲,不多,提前准备一个你项目中非常擅长并熟悉的点,即可。

三、编程题:实现以下功能

1) 编写一个自定义类:Person,父类为NSObject

解析:头文件这样写 @interface Person:NSObject

2) 该类有两个属性,外部只读的属性 name ,还有一个属性 age

解析: name 的修饰符 nonatomic , strong , readonly 。 age 的修饰符 nonatomic , copy 。

3) 为该类编写一个初始化方法 initWithName:(NSString *)nameStr ,并依据该方法参数初始化 name 属性。

解析:头文件声明该方法,实现文件实现该方法

4) 如果两个Person类的name相等,则认为两个Person相等

解析:重写 isEqual ,这里面涉及到了哈希函数在iOS中的应用。

四、由编程题衍生的口头题目

1) 怎样实现外部只读的属性,让它不被外部篡改

解析:

头文件用readonly修饰并声明该属性。正常情况下,属性默认是readwrite,可读写,如果我们设置了只读属性,就表明不能使用setter方法。在.m文件中不能使用 self.ivar = @"aa"; 只能使用实例变量 _ivar = @"aa"; ,而外界想要修改只读属性的值,需要用到kvc赋值 [object setValue:@"mm" forKey:@"ivar"]; 。

实现文件里面声明私有属性,并在头文件在protocol里面规定该属性就可以了,外部通过protocol获取,这样还可以达到隐藏成员的效果。

2) nonatomic是非原子操作符,为什么要这样,atomic为什么不行?有人说能atomic耗内存,你觉得呢?保读写安全吗,能保证线程安全吗?有的人说atomic并不能保证线程安全,你觉得他们的出发点是什么,你认同这个说法吗?

关于为什么用nonatomic

如果该对象无需考虑多线程的情况,请加入这个属性修饰,这样会让编译器少生成一些互斥加锁代码,可以提高效率。

而atomic这个属性是为了保证程序在多线程情况下,编译器会自动生成一些互斥加锁代码,避免该变量的读写不同步问题。

atomic 和 nonatomic 的区别在于,系统自动生成的 getter/setter 方法不一样。如果你自己写 getter/setter,那 atomic/nonatomic/retain/assign/copy 这些关键字只起提示作用,写不写都一样。

关于atomic语nonatomic的实现

苹果的官方文档 有解释,下面我们举例子解释一下背后的原理。

至于 nonatomic 的实现

//@property(nonatomic, retain) UITextField userName;//系统生成的代码如下:- (UITextField) userName {returnuserName;}- (void) setUserName:(UITextField*)userName_ { [userNameretain]; [userName release]; userName = userName;}

而 atomic 版本的要复杂一些:

`

//@property(retain) UITextField *userName;

//系统生成的代码如下:

(UITextField *) userName {

UITextField *retval = nil;

@synchronized(self) {

retval = [[userName retain] autorelease];

}

return retval;

}
喜欢小编的可以评论点赞支持一下哦!

猜你喜欢

转载自blog.51cto.com/13865003/2140586