1. ., 面试

1.1. Objective-C

1.1.1. weak strong assign copy 区别

assign 的“设置方法”只会执行针对“纯量类型” (scalar type,例如 CGFloat 或 NSlnteger 等)的简单赋值操作。

block 中的 weak

Masonry 需要用 weak 么,为什么?

1.1.2. ivar、getter、setter

@property 的本质是

@property = ivar + getter + setter;

“属性” (property)有两大概念:ivar(实例变量)、存取方法(access method = getter + setter)

1.1.3. @protocol 和 category 中如何使用 @property

objc_setAssociatedObjectobjc_getAssociatedObject

1.1.4. mutableCopy 和 copy

1.1.5. NSHashTable VS NSMapTable

  • NSHashTable 是 NSSet 的通用版本。可以弱引用、copy
  • NSMapTable 是 NSDictionary 的通用版本。可以弱引用、copy

1.1.6. [obj foo] 和 objc_msgSend() 关系

  • [obj foo] 在objc编译时,会被转意为:objc_msgSend(obj, @selector(foo))
  • [obj foo] 如果 foo 方法不存在会怎么处理

1.1.7. ARC 和 MRC

retain count autoreleasePool

1.1.8. self super 区别

其实 super 是一个 Magic Keyword, 它本质是一个编译器标示符,和 self 是指向的同一个消息接受者!他们两个的不同点在于:self 先从本类找,super 先从父类找。

所以 [self class][super class] 返回值一样,因为 class 方法都在 NSObject 对象实现。

1.1.9. self->_para 和 _para 还有 self.para 的区别

1.1.10. @synthesize 和 @dynamic 区别

  • @dynamic :修饰的属性,其getter和setter方法编译器是不会自动帮你生成。必须自己是实现的。
  • @synthesize:修饰的属性,其getter和setter方法编译器是会自动帮你生成。不必自己实现,可以指定与属性相对应的成员变量。

1.1.11. GCD

  • DISPATCH_QUEUE_SERIAL: 串行的队列,每次只能执行一个任务,并且必须等待前一个执行任务完成
  • DISPATCH_QUEUE_CONCURRENT: 一次可以并发执行多个任务,不必等待执行中的任务完成

dispatch_barrier_async

一般叫做“栅栏函数”,它就好像栅栏一样可以将多个操作分隔开,在它前面追加的操作先执行,在它后面追加的操作后执行。

dispatch_group_async

我们使用队列组来开辟线程时,队列组中的队列任务是并发,当所有的队列组中的所有任务完成时候,才可以调用队列组完成任务。

dispatch_semaphore_*

信号:Semaphore是通过‘计数’的方式来标识线程是否是等待或继续执行的。

1.1.12. 有哪些方法实现异步、延时

1.1.13. KVO 和 KVC

1.1.14. runtime

  • runtime 为 category 扩展属
  • runtime 修改方法
  • NSDictionary to Object
  • message_send

1.1.15. runloop

各个模式的区别

  • 每个线程(包括主线程)都有一个对应的 Runloop 对象。我们并不能自己创建 Runloop 对象,但是可以获取到系统提供的 Runloop 对象。
  • 主线程的 Runloop 会在应用启动的时候完成启动,其他线程的 Runloop 默认并不会启动,需要我们手动启动。

References

Runloop

1.1.16. +(void)load 和 +(void)initialize 的区别

load 是只要类所在文件被引用就会被调用,而 initialize 是在类或者其子类的第一个方法被调用前调用。

1.2. iOS

1.2.1. lldb 常用命令

1.2.2. Xcode 调试技巧

Zombile Objects 开启僵尸对象,在对象释放(retainCount为0)时,使用一个内置的Zombie对象,替代原来被释放的对象。无论向该对象发送什么消息(函数调用),都会触发异常,抛出调试信息。

1.2.3. iOS 装载和运行机制

1.2.4. iOS 性能调优

instruments

  • Allocations:监测内存使用/分配情况
  • leaks:找到引发内存泄漏的起点
  • Time Profiler:分析代码的执行时间,找出导致程序变慢的原因。

1.2.5. AutoLayout 和 UIViewAutoresizing

1.2.6. autoreleasePool

1.2.7. UIViewController 多次 push pop 后,内存会怎样?

1.2.8. UIScrollView 使用 AutoLayout 布局注意事项

contentView 不能由 AutoLayout 撑起来

1.2.9. 点击事件传递机制

事件的传递过程:

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event

事件响应:

//只要点击控件,就会调用touchBegin,如果没有重写这个方法,自己处理不了触摸事件
// 上一个响应者可能是父控件
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
// 默认会把事件传递给上一个响应者,上一个响应者是父控件,交给父控件处理
[super touchesBegan:touches withEvent:event];
// 注意不是调用父控件的touches方法,而是调用父类的touches方法
// super是父类 superview是父控件
}

一次完整的触摸事件的传递响应过程为:

UIApplication–>UIWindow–>递归找到最合适处理的控件–>控件调用touches方法–>判断是否实现touches方法–>没有实现默认会将事件传递给上一个响应者–>找到上一个响应者–>找不到方法作废

1.2.10. iPhoneX 适配

safe area

1.2.11. MVC 和 MVVM,MVP

  • MVC:简单来说就是,逻辑、试图、数据进行分层,实现解耦。
  • MVVM:是Model-View-ViewMode模式的简称。由视图(View)、视图模型(ViewModel)、模型(Model)三部分组成.比MVC更加释放控制器臃肿,将一部分逻辑(耗时,公共方法,网络请求等)和数据的处理等操作从控制器里面搬运到ViewModel中

1.2.12. 数据持久化的几个方案

  • plist,存储字典,数组比较好用
  • preference:偏好设置,实质也是plist
  • NSKeyedArchiver:归档,可以存储对象
  • sqlite:数据库,经常使用第三方来操作,也就是fmdb
  • coreData:也是数据库储存,苹果官方的

1.2.13. UITableview 的优化方法(缓存高度,异步绘制,减少层级,hide,避免离屏渲染)

1.2.14. 第三方框架

  • SDWebImage
  • Masonry
  • MJPullRefresh
  • MJExtension
  • FMDB
  • AFNetwork

1.2.15. 设计模式

iOS 用到了哪些典型的设计模式

1.3. References

results matching ""

    No results matching ""