1、如何进行 cell 高度的缓存?说一下 UITableView-FDTemplateLayoutCell 的实现原理?
缓存 cell 高度:
- 如果用的 frame ,则给 model 添加一个 cellH 的属性,然后在获取数据时计算好高度赋值给 cellH。
- 如果用的 AutoLayout,创建相应布局等同的 cell,计算好高度然后缓存。
FD 的实现:
fd_heightForCellWithIdentifier: configuration:
方法会根据 identifier 以及 configuration block 提供一个和 cell 布局相同的 template layout cell,并将其传入 fd_systemFittingHeightForConfiguratedCell:
这个私有方法返回计算出的高度。主要使用技术为 runtime 。
2、在 Block 中使用 成员变量 (如:_name) 会造成循环引用吗(比如下面的代码)?如何解决?
typedef void(^TestBlock)(void);
@interface DetailViewController ()
@property (nonatomic, copy) NSString *name;
@property (nonatomic, copy) TestBlock block;
@end
@implementation DetailViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.name = @"fzh";
self.block = ^() {
NSLog(@"%@", _name);
};
}
@end
会造成循环引用,因为 _name 底层也是通过 self 去获取( self->_name
)。
->
: 指向结构体成员运算符。
解决方案:
- 强制将 block 置空,代码如下:
weakSelf.block = nil;
- 通过 weak、strong self 来解决,代码如下:
__weak typeof(self) weakSelf = self;
self.block = ^() {
__strong typeof(weakSelf) strongSelf = weakSelf;
NSLog(@"%@", strongSelf->_name);
};
在 block 还是推荐使用点语法去访问成员变量。
3、isa 指针的作用?它的应用场景?
作用 :isa 指针指向它的类对象,从而可以找到对象上的方法。
应用场景:
- KVO - isa 混写 (isa-swizzling)
4、描述消息转发机制?它的应用场景?
如果你给某个对象发送消息,而该对象没有实现该方法的话,就会进行消息转发,共有以下三步:
- Method resolution
- Fast forwarding
- Normal forwarding
若以上三步皆不成功,则会报 unrecognized selector sent to …
的异常。
应用场景:
- 特定奔溃预防处理
- 苹果系统 API 迭代造成 API 不兼容的奔溃处理
5、组件化的了解,各组件之间如何通信?CTMediator 的底层实现原理?
组件化 :按照项目功能模块分割成多个组件来开发维护,以此来降低项目的耦合性。
各组件如何通信 :
- 创建一个 Mediator,各组件通过 Mediator 通信,即 runtime 调度。
- 注册表的方式,用URL表示接口,在模块启动时注册模块提供的接口,即 URL/protocol 注册调度。
CTMediator 主要是基于Mediator模式和Target-Action模式,中间采用了 runtime 来完成调用。
6、array 的 copy 和 mutableCopy 的区别?mutableCopy 如果每个元素都是对象,那么会开辟新的内存空间吗?如何开辟新的内存空间?
copy 为指针拷贝(内存地址一致),mutableCopy 为内容拷贝(内存地址不一致)。
如果元素为对象,不会开辟新的内存空间,因为 mutableCopy 是单层浅复制,我们需要给对象单独实现一个深复制的方法才可以。
- (id)deepCopy {
CYLUser *copy = [[[self class] alloc] initWithName:_name
age:_age
sex:_sex];
copy->_friends = [[NSMutableSet alloc] initWithSet:_friends
copyItems:YES];
return copy; }
7、Fastlane 在使用中遇到什么问题?
没遇到过啥问题-_-||,如果又遇到啥问题的同学可以在评论区提出来大家讨论一下。
推荐👇:
如果你想一起进阶,不妨添加一下交流群642363427