此篇文章为 2018 年中我还在滴滴时,为项目组招聘新的 iOS 实习同窗所作,部份内容已不适用,仅供参考。html
如下为某些同窗的评论,为了不本文出发点和其它同窗观点不一样而浪费双方时间,把个别评论置顶从新回复。ios
恕我直言,如今毕业院校稍好一点的、或者在校成绩好一点的实习生根本没人去作iOS的面试
答:恕我直言,如今家庭背景稍好一点的人根本不会去工做的。算法
为啥要学ios,移动端都混合开发了数组
答:为啥要用嘴吃饭,如今均可以直接插管流食了,多好~缓存
如下是我列出来的可以帮助你们招到一个 靠谱的iOS实习生 须要掌握的点,再次说明下状况:多线程
int **a : 指向一个指针的指针,该指针指向一个整数。
int *a[10] : 指向一个有10个指针的数组,每一个指针指向一个整数。
int (*a)[10] : 指向一个有10个整数数组的指针。
int (*a)(int) : 指向一个函数的指针,该函数有一个整数参数,并返回一个整数。
复制代码
在 OC 中定义一个枚举有三种作法:并发
NS_ENUM
宏进行定义;NS_OPTIONS
宏进行定义;NS_ENUM
为定义通用性枚举,只能单选,NS_OPTIONS
为定义位移枚举,可多选。 // 枚举为啥要这么分?由于涉及到是否使用 C++ 模式进行编译有关。异步
copy
修饰符进行修饰,且不能使用retain
进行修饰,由于retain
只是进行了一次回调,但 block 的内存仍是放在了栈空间中,在栈上的变量随时会被系统回收,且Block在建立的时候内存默认就已经分配在栈空间中,其自己的做用域限于其建立时,一旦在超出其建立时的做用域以外使用,则会致使程序的崩溃,故使用 copy
修饰,使其拷贝到堆空间中,block 有时还会用到一些本地变量,只有将其 copy 到堆空间中,才能使用这些变量。Computer : NSObject
Mac : Computer
@implementation Mac
NSLog(@"%@", [self class]);
NSLog(@"%@", [super class])
@end
复制代码
两者都会输出Mac。函数
objc_msgSend
函数,其定义为id objc_msgSend(id self, SEL op, ...)
,第一个参数是Mac实例,但其并没有-(Class)class
方法,此时去父类Computer中寻找,发现也没有,再去其父类NSObject
中找,找到了!返回的就是self
其自己,可猜想其方法实现以下:- (Class)class {
return object_getClass(self);
}
复制代码
objc_msgSendSuper
函数,其定义为id objc_msgSendSuper(struct objc_super *super, SEL op, ...)
,而struct objc_super
结构体的定义为:struct objc_super {
__unsafe_unretained id receiver;
__unsafe_unretained Class super_class;
}
复制代码
因此转换成objc_msgSendSuper
函数后,第一步要先去构造objc_super
结构体,结构的第一个成员receiver
就是self
,第二个成员是(id)class_getSuperclass(object_getClass("Mac"))
,该函数输出的结果为super_class值,即Computer
,第二步,则去Computer
类中去找- (Class)class
,发现并未找到,接着去NSObject中找,找到了!最后是使用了objc_msgSend(objc_super->receiver, @selector(class))
去调用了,这个时候已经跟以前的[self class]调用输出结果重复了,返回结果仍是Mac
。static NSString *cellID = @"cellID";
防止由于调用次数过多,static保证只建立一次,提升性能(感受性能的提高能够忽略不记emmm)dequeueReusableCellWithIdentifier:(NSString *)ID
会查询可重用Cell,若注册了原型Cell则可以查询到,不然为nil,故须要先判断if(cell == nil)
dequeueReusableCellWithIdentifier:(NSString *)ID indexPath:(NSIndexPath *)indexPath
,使用以前必须经过SB/class进行可重用Cell的注册(registerNib/registerClass),不须要判断nil,必定会返回cell,若缓冲区Cell不存在,会使用原型Cell从新实例化一个新Cell。heightForRowAtIndexPath
获取每一个Cell即将显示的高度,实际上就是要肯定总的tableView.contenSize,最后才又接着调用cellForRowAtIndexPath
,能够建一个frame模型,保存下提早计算好的cell高度。ASDK
这个库进行。static User *user;
+ (User *)shareInstance {
if (user == nil) {
@synchronized(self) {
// 加锁
user = [User alloc] init];
}
}
return user;
}
+ (User *)shareInstance {
static dispatch_onec_t onecToken;
dispatch_onece(&onceToken, ^{
user = [User alloc] init;
})
return user;
}
复制代码
总结:再次说明,实际电面过程当中,本套题只可做为参考,并且在电面过程当中会有追问和等待的过程,因此最佳电面时间为三十分钟内最佳,嫌短?记好了!这招的是实习生,并且这仍是电面!!!别学啥大公司的戾气,一个实习生的电面你要搞一个小时甚至快两个小时,没有必要。若是是face to face随你问一两个小时,但重点是这是电面!不要把这种“隔空喊话”的面试方式做为考核一我的是否具有对应的工做能力的最终标准,除非可以肯定之后的工做方式就是“隔空喊话”和“隔空撸码”。
也不推荐把本套题中的内容做为一面,一面应该是做为了解应聘者的职业情况,基础水平(也是就是逻辑能力),推荐本套题做为二面,涵盖基本的iOS开发基础知识,并且时间可以较好的把握在三十分钟内,三面应该侧重项目实际状况,并且最好face to face。四面就HR面了吧,尽可能不要有五面了,太难受了。其实三面是最佳的。
记住!不要套题,而应该是举一反三,引出其它问题。