iOS记录

iOS面试资料(二)

2022-03-10  本文已影响0人  JamieChen

iOS面试题

Block相关

Block

关于block的截获特性,你是否有了解?block的截获变量特性是怎样的?

对栈上的block进行copy之后,假如在mrc环境下,内存是否回泄漏?

为什么block会产生循环引用?

Block不允许修改外部变量的值原因

如何实现对外部变量的捕获?

__block

__block int var = 10;
void(^blk)(void) = ^{
    var = 20;
};
blk();

转换后的代码:

struct __Block_byref_var_0 {
    void *__isa;
    __Block_byref_var_0 *__forwarding;
    int __flags;
    int __size;
    int var; // 10 => 20 该结构体持有相当于原来自动变量的成员变量
};

struct __main_block_impl_0 {
    struct __block_impl impl;
    struct __main_block_desc_0* Desc;
    __Block_byref_var_0 *var; // by ref
    __main_block_impl_0(void *fp, struct __main_block_desc_0 *desc, __Block_byref_var_0 *_var, int flags=0) : var(_var->__forwarding) {
        impl.isa = &_NSConcreteStackBlock;
        impl.Flags = flags;
        impl.FuncPtr = fp;
        Desc = desc;
    }
};

block在修改NSMutableArray需不需要添加__block

block是如何捕获局部变量的?

UIView动画中block回调里self要不要弱引用?

block里面会不会存在self为空的情况(weak strong的原理)?

__weak typeof(self) weakself = self;
[self wj_refresh_addRefreshHeader:^{
    __strong typeof(weakself) strongself = weakself;
    [strongself.dataSource reloadDataWithCompletion:nil];
}];

__block与__weak的区别

多层block嵌套如何使用weakSelf?

__weak typeof(self) weakself = self;
[self wj_refresh_addRefreshHeader:^{
    __strong typeof(weakself) strongself = weakself;
    __weak typeof(self) weakSelf2 = strongself;
    [strongself.dataSource reloadDataWithCompletion:^(BOOL result) {
        __strong typeof(self) strongSelf2 = weakSelf2;
    }];
}];

Masonry对于block内部引用self会不会造成循环引用?

- (NSArray *)mas_makeConstraints:(void(NS_NOESCAPE ^)(MASConstraintMaker *))block {
    self.translatesAutoresizingMaskIntoConstraints = NO;
    MASConstraintMaker *constraintMaker = [[MASConstraintMaker alloc] initWithView:self];
    block(constraintMaker);
    return [constraintMaker install];
}

__weak来解决block中的循环引用,还有别的方法吗

代理、Block利弊

Runtime

Runtime的相关术语

SEL、id、Class、Method、IMP、Cache、Property

介绍下runtime的内存模型(isa、对象、类、metaclass、结构体的存储信息等)

为什么要设计metaclass

class_copyIvarList & class_copyPropertyList区别

class_rw_t 和 class_ro_t 的区别

讲述一下runtime的概念,message send如果寻找不到相应的对象,会如何进行后续处理 ?

交互两个方法的现实有什么风险?

Runloop

/*
 * 从字典中获取,如果没有则直接创建
 */
CFRunLoopRef loop = (CFRunLoopRef)CFDictionaryGetValue(__CFRunLoops, pthreadPointer(t));
__CFSpinUnlock(&loopsLock);
if (!loop) {
    CFRunLoopRef newLoop = __CFRunLoopCreate(t);
    __CFSpinLock(&loopsLock);
    loop = (CFRunLoopRef)CFDictionaryGetValue(__CFRunLoops, pthreadPointer(t));
    
    if (!loop) {
        CFDictionarySetValue(__CFRunLoops, pthreadPointer(t), newLoop);
        loop = newLoop;
    }
    
    // don't release run loops inside the loopsLock, because CFRunLoopDeallocate may end up taking it
    __CFSpinUnlock(&loopsLock);
    CFRelease(newLoop);
}

NSTimer相关

NSTimer准吗?如果不准的话原因是什么?如何解决?

使用NSTimer是如何处理循环引用的?

使用类方法
TODO(待填充);

谈谈常用的三种定时器优缺点(NSTimer、CADisplayLink、GCD定时器)✨✨✨✨✨

在viewWillDisappear或者viewDidDisappear方法中将 timer = nil,是否还会造成循环引用?

如何利用runloop监控卡顿✨✨✨

NSThread中的Runloop的作用,如何使用

NSRunLoop *runLoop = [NSRunLoop currentRunLoop];
[runLoop addPort:[NSMachPort port] forMode:NSRunLoopCommonModes];
[runLoop run];

KVO

KVO基础

KVO 的 全称Key-Value Observing,俗称“键值监听”,可以用于某个对象属性值的改变

iOS用什么方式实现对一个对象的KVO?(KVO的本质是什么)

如何手动触发KVO?

直接修改成员变量会触发KVO么?

KVC

KVC基础

KVC的全称是Key-Value Coding,俗称“键值编码”,可以通过一个key来访问某个属性

通过KVC修改属性会出发KVO么?

KVC的赋值和取值过程是怎样的?

使用场景

[self.model setValuesForKeysWithDictionary:dict];
UILabel *placeholderLabel=[self.userTextField valueForKeyPath:@"placeholderLabel"];
placeholderLabel.textColor = [UIColor redColor];
CGFloat sum = [[array valueForKeyPath:@"@sum.floatValue"] floatValue];
CGFloat avg = [[array valueForKeyPath:@"@avg.floatValue"] floatValue];
CGFloat max =[[array valueForKeyPath:@"@max.floatValue"] floatValue];
CGFloat min =[[array valueForKeyPath:@"@min.floatValue"] floatValue];
[dataArray valueForKeyPath:@"@distinctUnionOfObjects.self"]
NSArray *temp1 = @[@3, @2, @2, @1];
NSArray *temp2 = @[@3, @4, @5];
NSLog(@"\n%@",[@[temp1, temp2] valueForKeyPath:@"@distinctUnionOfArrays.self"]);
NSLog(@"\n%@",[@[temp1, temp2] valueForKeyPath:@"@unionOfArrays.self"]);

输出两个数组:( 5, 1, 2, 3, 4 ), ( 3, 2, 2, 1, 3, 4, 5 )。

NSArray *array = @[@"name", @"w", @"aa", @"jimsa"];
NSLog(@"%@", [array valueForKeyPath:@"uppercaseString"]);
打印:
(NAME,W,AA,JIMSA)

简单介绍一下KVC和KVO,他们都可以应用在哪些场景?

Category

Category相关

Category的使用场合

Category的实现原理

category和extension区别

分类的局限性

为什么category不能添加属性?使用Runtime就可以了?

Category中有load方法么?load方法什么时候调用的?load方法能继承么?

test方法和load方法的本质区别?(+load方法为什么不会被覆盖)

load调用顺序

不同Category中存在同一个方法,会执行哪个方法?如果是两个都执行,执行顺序是什么样的?

load、initialize方法的区别是什么?它们在category中的调用顺序?以及出现继承时他们之间的调用过程?🌟🌟🌟🌟🌟

区别:

分类中方法替换

为什么不能动态添加成员变量?

上一篇下一篇

猜你喜欢

热点阅读