阅读 1189

iOS 新东方面试

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 在使用中遇到什么问题?

没遇到过啥问题-_-||,如果又遇到啥问题的同学可以在评论区提出来大家讨论一下。

参考

关注下面的标签,发现更多相似文章
评论