本文是对观看sunnyxx(孙源)大神直播写的记录,加强自己的记忆,也希望对同行们有所帮助
关于简历方面
1、项目描述过于简单宽泛
项目规模?你在其中的职责?详细介绍使用的技术栈?遇到的挑战以及如和解决的?
2、专业技能千篇一律
在列举技术名词的时候最好写出用这个技术干了什么。比如“熟练运用
objc runtime
,曾使用它做了ViewController
进入和退出时的AOP
埋点”
3、格式、拼写、细节
Object-C//这个我相信没人知道是啥写全时最好的 Objective-C
Foudation//拼写错误
ios/IOS/Ios//iOS这样更好
AFNetWorking//networking是一个单词不需要驼峰
xcode/Xcode//第二个肯定更正确
4、需要提供更多的信息来体现你的特别
Blog
GitHup
技术探索
对技术的个人理解以及做过什么有意思的事
5、谦虚、真实
写最真实的简历,这个还是很重要的吧
面试套路
这一块也是根据面试官不同而又差异性。列举几个
1、最近的工作经历,做了什么App,拿出来玩一玩。询问面试者负责的是哪一部分。
2、找面试者最熟悉的业务。描述大概的设计结构,UI层级,交互效果,布局等(考察基本业务能力,熟练程度,质量)
3、考察基础问题。如内存基础,多线程等。答的可以会深挖。
4、很厉害了了就会问一些高级的问题,涉及到底层原理这些。
建议:
- 不会的问题可以猜一下,不要陷入无限的思考和一本正经的胡说八道。也可以当场请求面试官,学一下。
- 保持沟通顺畅
- 保持谦虚,不要装x
几个iOS面试题
//@property能使用哪些关键字及作用是什么
//下面四种写法有什么区别?
@property(nonatomic, strong)NSArray *array0;
@property(nonatomic, copy) NSArray *array1;
@property(nonatomic, strong)NSMutableArray *array2;
@property(nonatomic, copy) NSMutableArray *array3;
//可使用的关键字:
strong:强引用,增加对象的引用计数。会引起外界对象改变导致自己也会改变
copy:复制对象,防止外界对象改变对自己进行改变
weak:弱引用。对象消失后会将指针指向nil
assign:简单赋值。一般用于基础类型数据
//区别:
第一种跟第二种的写法,一般采用第二种。因为如果外界的对象对属性赋值后,如果使用strong修饰那么属性值也会更该,相反copy修饰不会。
第三种跟第四种写法也是采用第三种。因为可变对象用copy修饰后会变为不可变对象,这时再写不可变方法就会crash。
基本内存管理
//下面对象分别都在什么时候释放
- (void)ARCProblem {
id obj0 = @"sunnuyxx";
__weak id obj1 = obj0;
id obj2 = [NSObject new];
__weak id obj3 = [NSObject new];
{
id obj4 = [NSObject new];
}
__autoreleasing id obj5 = [NSObject new];
__unsafe_unretained id obj6 = self;
}
//解答
obj0:一直在,常量区
obj1:不会释放跟0有关
obj2:用完obj2就会释放
obj3:本行结束之后就没了
obj4:在区域结束时结束
obj5:自动释放池
obj6:该修饰词不会做任何操作,不知道什么时候释放
UIViewcontroller
//这样写会发生什么?
- (void)viewDidLoad{
[super viewDidLoad];
self.view = nil;
}
//很可能发生递归,不是很确定。大家可以自己测试一下
关于UITableViewDataSource 和UITableViewDelegate的主要方法还有调用顺序。
这个我们自己测试一下就好了。
block内存管理
//如何解决下面代码问题
-(void)blockRetainCycleProblem{
self.block = ^{
NSLog(@"%@",@[self]);
};
}//循环引用。block跟self相互持有,如果这里不是self的block就不会出问题
//解决方法
-(void)blockRetainCycleProblem{
__ weak typeof(self) weakSelf = self;
self.block = ^{
NSLog(@"%@",@[weakSelf]);
};
}//这是我经常写的方法
-(void)blockRetainCycleProblem{
__ weak typeof(self) weakSelf = self;
self.block = ^{
__ strong typeof(weakSelf) strongSelf = weakSelf;
NSLog(@"%@",@[strongSelf]);
};
}//第二种
-(void)blockRetainCycleProblem
{
__ weak typeof(self) weakSelf = self;
self.block = ^{
__ strong typeof(weakSelf) strongSelf = weakSelf;
if(strongSelf)
{
NSLog(@"%@",@[weakSelf]);
}
};
}//第三种
第一种:是我经常写的方法,这里出问题了如果self释放了,weakSelf指向nil,数组里面放nil也一样会crash。
第二种:接一下的时候很可能weakSelf已经置为nil,一样会crash。
第三种:做一次判断是否nil,完善了写法。
block内存管理扩展
- (void)blockRetainCycleProblemExt
{
//下面的self用不用weak?
[UIView animateWithDuration:1 animations:^{
self.view.frame = CGRectMake(1,2,3,4);
}];
//那这个呢?
[UIView animateWithDuration:1 delay:100000 optios:0 animations:^{
self.view.frame = CGRectMake(1,2,3,4);
} completion:nil];
}
//解答 :
类方法。这里面的block是瞬间执行的。
理解应用架构
//对 MVC 和 MVVM 的理解真的到位么
深入理解内存管理
1、Stack 和 Heap 分别的使用,如何管理?
2、ARC 是如何实现的?
3、Autorelease 对象如何释放?
4、AutoreleasePool 是如何实现的?
理解 Class 和对象模型
理解 RunLoop
深入理解消息机制
//从写下 [ obj foo]这行代码直到运行时 foo 被调用,
//尽量详细的描述,中间都发生了什么?
掌握:objc_msgSend 的关键调用,后续如何通过 selector 从 isa 找到 IMP,若运行时没找到 foo 会如何?
精通:编译器如何编译成 objc_msgSend、 消息 cache 机制、消息转发机制、 objc_msgSend 的各个版本、objc_msgSend 的实现、跳板机制等等
魔法数字
//64位,下面魔法数字会输出什么,为什么?
- (void)magicNumberProblem
{
NSLog(@"%@",11529223390768879413UL);//Tagged Pointer
}
另辟蹊径的 block 调用
//如果禁止直接调用:block();
//那能否找到2个以上另辟蹊径的方式让 block 被调用?
void (^block)(void) = ^{
NSLog(@"block get called");
};
block();//禁止调用
//解决:
让别人帮你调用 传入block
[UIView animateWithDuration:0 animation:block];//这里的bolck立马调用
dispatch_async(dispatch_get_main_queue(), block);
[[NSBlockOperation blockOperationWithBlock:block] start];
谈谈iOS进阶
漫长的知识点积累
- 看书
- 看博客
- 实战总结
- 刨根问底
联想、理解,有自己的思考、对技术的主见
总结
看完直播后感觉基础好差。积累的还是不够多,接下来就这针对这些问题好好的研究研究了。
网友评论