美文网首页
iOS基础复习

iOS基础复习

作者: UILabelkell | 来源:发表于2019-10-08 11:59 被阅读0次

    基础部分(题目来自掘金上面一位朋友写的文章,答案自己写的)

    1、分类和扩展有什么区别?可以分别用来做什么?分类有哪些局限性?分类的结构体里面有哪些成员?

    答:category分类:(1)可以在不修该原来类的基础上,为类扩展一个方法。####(给系统自带类扩展方法)
    分类中能写的:有三种:1、分类中只能添加方法,不能增加成员变量。2、分类中可以访问原来类的变量,但是只能访问@protect和@public形式的变量。如果想要访问本类中的私有变量,分类和子类一样,只能通过方法来访问。3、如果一定要在分类中添加成员变量,可以通过getter,setter手段进行添加。
    类扩展(extension)是category的一个特例,有时候也被称为匿名分类或者私有类。他的作用是为一个类添加一些私有的成员变量和方法。
    类扩展能写点啥?和分类不同,类扩展即可以声明成员变量又可以声明方法。
    类扩展中添加的新方法,一定要实现。categorygory中没有这种限制

    2、讲一下atomic的实现机制;为什么不能保证绝对的线程安全(最好可以结合场景来说)?

    atomic作用:多线程下将属性设置为atomic可以保证读取数据的一致性。因为他将保证数据只能被一个线程占用,也就是说一个线程对属性进行写操作时,会使用自旋锁锁住该属性。不允许其他的线程对其进行读取操作了。

    但是它有一个很大的缺点:因为它要使用自旋锁锁住该属性,因此它会消耗更多的资源,性能会很低。要比nonatomic慢20倍。

    内部实现:property 的 atomic 是采用 spinlock_t (自旋锁)实现的。
    // getter方法

    id objc_getProperty(id self, SEL _cmd, ptrdiff_t offset, BOOL atomic) 
    {
        // ...
        if (!atomic) return *slot;
    
        // Atomic retain release world
        spinlock_t& slotlock = PropertyLocks[slot];
        slotlock.lock();
        id value = objc_retain(*slot);
        slotlock.unlock();
        // ...
    }
    
    // setter
    static inline void reallySetProperty(id self, SEL _cmd, id newValue, ptrdiff_t offset, bool atomic, bool copy, bool mutableCopy)
    {
        // ...
        if (!atomic) 
    {
            oldValue = *slot;
            *slot = newValue;
        } 
    else 
    {
            spinlock_t& slotlock = PropertyLocks[slot];
            slotlock.lock();
            oldValue = *slot;
            *slot = newValue;        
            slotlock.unlock();
        }
        // ...
    }
    
    
    简而言之,atomic的作用只是给getter和setter加了个锁,atomic只能保证代码进入getter或者setter函数内部时是安全的,一旦出了getter和setter,多线程安全只能靠程序员自己保障了。所以atomic属性和使用property的多线程安全并没什么直接的联系。另外,atomic由于加锁也会带来一些性能损耗,所以我们在编写iOS代码的时候,一般声明property为nonatomic,在需要做多线程安全的场景,自己去额外加锁做同步。

    指针Property指向的内存区域
    property可以分为值类型和引用类型。值类型就是一些基本的数据类型。而引用类型就是指的各种对象。声明为指针,指向这个属性所在的内存区域。
    因此当我们访问一个属性的时候,有可能访问的是指针本身,还有可能访问的是这个指针指向的内存区域。

    3、被weak修饰的对象在被释放的时候会发生什么?是如何实现的?知道sideTable么?里面的结构可以画出来么?

    答:被weak修饰的对象在被释放的时候自动置nil

    weak的实现原理

    第一、通过weak编译解析,可以看出来weak通过runtime初始化的并维护的;
    第二、weak和strong都是Object-C的修饰词,而strong是通过runtime维护的一个自动计数表结构。
    综上:weak是有Runtime维护的weak表。

    在runtime源码中,可以找到'objc-weak.h'和‘objc-weak.mm’文件,并且在objc-weak.h文件中关于定义weak表的结构体以及相关的方法。

    4、关联对象有什么用,系统如何管理关联对象?其被释放的时候需要手动将所有的关联对象的指针置空么?

    答:有时需要在对象中存放相关信息,这时我们通常会从所属的类中继承一个字类,然后改用这个字类对象。然而并非所有情况下都能这样做,有时候类的实例可能是由某种机制创建的,而开发者无法令这种机制创建出自己所写的字类实例。OC中有一种很强大的特性可以解决此问题,就是“关联对象”。

    可以通过下列方法管理关联对象:

    void objc_setAssociatedObject (id object, void*key, id value, objc_AssociationPolicy policy)

    此方法以给定的键和策略为某对象设置关联值。

    id objc_getAssociatedObject(id object, void *key)

    此方法根据给定的键从某对象中获取相应的关联对象值。

    void objc_removeAssociatedObjects(id object)

    此方法移除指定对象的全部关联对象。
    用法举例:

    - (void)askUserAQuestion {
    
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"question"
    
                                                        message:nil
    
                                                       delegate:self
    
                                              cancelButtonTitle:@"取消"
    
                                              otherButtonTitles:@"确定", nil];
    
        [alert show];
    
    }
    
    #pragma mark - <UIAlertViewDelegate>
    
    - (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
    
        if (buttonIndex == 0) {
    
            // do ...
    
        }else {
    
            // do ...
    
        }
    
    }
    

    但是有时候我们想让创建警告视图与处理操作结果的代码都放在一起,这样更易懂我们也不需要在两部分代码之间来回游走,即可明白视图的用处。所以我们采用关联对象修改一下:

    static void *alertViewKey = "alertViewKey";
    
    - (void)askUserAQuestion {
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"question"
                                                        message:nil
                                                       delegate:self
                                              cancelButtonTitle:@"取消"
                                              otherButtonTitles:@"确定", nil];
        void (^block)(NSInteger) = ^(NSInteger buttonIndex) {
            if (buttonIndex == 0) {
                // do something
            }else {
                // do something
            }
        };
        objc_setAssociatedObject(alert,
                                 alertViewKey,
                                 block,
                                 OBJC_ASSOCIATION_RETAIN_NONATOMIC);
        [alert show];
    }
    #pragma mark - <UIAlertViewDelegate>
    - (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
        void (^block)(NSInteger) = objc_getAssociatedObject(alertView, alertViewKey);
        block(buttonIndex);
    }
    

    5、KVO的底层实现?如何取消系统默认的KVO并手动触发(给KVO的触发设定条件:改变的值符合某个条件时再触发KVO)?

    6、Autoreleasepool所使用的数据结构是什么?AutoreleasePoolPage结构体了解么?

    7、讲一下对象,类对象,元类,跟元类结构体的组成以及他们是如何相关联的?为什么对象方法没有保存的对象结构体里,而是保存在类对象的结构体里?

    8、class_ro_t 和 class_rw_t 的区别?

    9、iOS 中内省的几个方法?class方法和objc_getClass方法有什么区别?

    10、在运行时创建类的方法objc_allocateClassPair的方法名尾部为什么是pair(成对的意思)?

    11、一个int变量被__block修饰与否的区别?

    12、为什么在block外部使用__weak修饰的同时需要在内部使用__strong修饰?

    13、RunLoop的作用是什么?它的内部工作机制了解么?(最好结合线程和内存管理来说)

    14、哪些场景可以触发离屏渲染?

    iOS 实战题

    1、AppDelegate如何瘦身?

    2、反射是什么?可以举出几个应用场景么?(知道多少说多少)

    3、有哪些场景是NSOperation比GCD更容易实现的?(或是NSOperation优于GCD的几点)

    4、App 启动优化策略?最好结合启动流程来说(main()函数的执行前后都分别说一下)

    5、App 无痕埋点的思路了解么?你认为理想的无痕埋点系统应该具备哪些特点?

    6、你知道有哪些情况会导致app崩溃,分别可以用什么方法拦截并化解?

    7、你知道有哪些情况会导致app卡顿,分别可以用什么方法来避免?

    网络题

    1、App 网络层有哪些优化策略?

    2、TCP为什么要三次握手,四次挥手?

    3、对称加密和非对称加密的区别?分别有哪些算法的实现?

    4、HTTPS的握手流程?为什么密钥的传递需要使用非对称加密?双向认证了解么?

    5、HTTPS是如何实现验证身份和验证完整性的?

    6、如何用Charles抓HTTPS的包?其中原理和流程是什么?

    7、什么是中间人攻击?如何避免?

    计算机系统题

    1、了解编译的过程么?分为哪几个步骤?

    2、静态链接了解么?静态库和动态库的区别?

    3、内存的几大区域,各自的职能分别是什么?

    4、static和const有什么区别?

    5、了解内联函数么?

    6、什么时候会出现死锁?如何避免?

    7、说一说你对线程安全的理解?

    8、列举你知道的线程同步策略?

    9、有哪几种锁?各自的原理?它们之间的区别是什么?最好可以结合使用场景来说

    设计模式题

    1、除了单例,观察者设计模式以外,还知道哪些设计模式?分别介绍一下

    2、最喜欢哪个设计模式?为什么?

    3、iOS SDK 里面有哪些设计模式的实践?

    4、**设计模式是为了解决什么问题的?

    5、**设计模式的成员构成以及工作机制是什么?

    6、**设计模式的优缺点是什么?

    架构 & 设计题

    1、MVC和MVVM的区别?MVVM和MVP的区别?

    2、面向对象的几个设计原则了解么?最好可以结合场景来说。

    3、可以说几个重构的技巧么?你觉得重构适合什么时候来做?

    4、你觉得框架和设计模式的区别是什么?

    5、看过哪些第三方框架的源码,它们是怎么设计的?设计好的地方在哪里,不好的地方在哪里,如何改进?(这道题的后三个问题的难度已经很高了,如果不是太N的公司不建议深究)

    数据结构&算法题

    链表和数组的区别是什么?插入和查询的时间复杂度分别是多少?

    哈希表是如何实现的?如何解决地址冲突?

    排序题:冒泡排序,选择排序,插入排序,快速排序(二路,三路)能写出那些?

    链表题:如何检测链表中是否有环?如何删除链表中等于某个值的所有节点?

    数组题:如何在有序数组中找出和等于给定值的两个元素?如何合并两个有序的数组之后保持有序?

    二叉树题:如何反转二叉树?如何验证两个二叉树是完全相等的?

    http://www.cocoachina.com/articles/88847?filter=ios

    相关文章

      网友评论

          本文标题:iOS基础复习

          本文链接:https://www.haomeiwen.com/subject/iaqbpctx.html