iOS 底层面试CFiOS

iOS面试基础

2021-03-02  本文已影响0人  iOS鑫

iOS基础类

这里包含了去哪儿,滴滴,蚂蚁金服,美团,今日头条,快手以及其它公司的一些面试题,大部分面试官问的重复的问题很多,总体来说就是以下的面试题。

作为一个开发者,有一个学习的氛围跟一个交流圈子特别重要,这是一个我的iOS开发交流群:130595548,不管你是小白还是大牛都欢迎入驻 ,让我们一起进步,共同发展!(群内会免费提供一些群主收藏的免费学习书籍资料以及整理好的几百道面试题和答案文档!)

  1. 简述iOS中的内存管理方式

  1. block的分类,__block的作用,block循环引用产生的原因及解决办法

3.深拷贝与浅拷贝


4.iOS中常见的属性和默认的对象属性


5.哪些属性需要声明成copy,为什么?

@interface ViewController ()
@property (nonatomic, copy)NSString *aStr;
@property (nonatomic, strong)NSString *bStr;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
//    [self buildUI];
    [self testCode];
}

- (void)testCode{

    NSMutableString *mutableStr = [NSMutableString stringWithFormat:@"%@", @"abc"];
    self.aStr = mutableStr;
    self.bStr = mutableStr;
    [mutableStr appendString:@"123"];
    NSLog(@"copy修饰的字符串:%@", self.aStr);
    NSLog(@"strong修饰的字符串:%@", self.bStr);
}

打印结果:

2018-05-22 21:13:58.344883 TTFeedBackDemo[1224:245923] copy修饰的字符串:abc
2018-05-22 21:13:58.345004 TTFeedBackDemo[1224:245923] strong修饰的字符串:abc123

用了copy属性修饰之后,可以防止这些类型的对象被引用并且改变内容。


  1. 通知,代理,block,KVO的使用场景分别是什么,有什么区别?

  1. 简述对OC中的isa指针的认识

Ojective-C语言是基于C语言的封装,它实现了将面向过程的语言向面向对象的语言的转变。而OC中绝大部分类又是继承于NSObject类的,所以研究清楚NSObject类的构成,对于理解OC语言很有帮助。 ##### NSObject类引入了两个头文件:#include <objc/objc.h>#include <objc/NSObjCRuntime.h>,第一个头文件引入的是objc结构体的构成方式即isa指针,第二个头文件引入的是Runtime消息查找机制。 ##### 接下来又引入了三个类的声明:@class NSString, NSMethodSignature, NSInvocation; ##### NSMethodSignature和NSInvacation和OC的方法转发机制有关,而NSString是与NSObject的+ (NSString *)description方法有关。

isa指针: 代码如下

@interface NSObject <NSObject> {
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wobjc-interface-ivars"
Class isa  OBJC_ISA_AVAILABILITY;
#pragma clang diagnostic pop
}

NSObject对象其实包含了一个Class类型的isa指针。
这个和id类型是一样的,代码如下:

struct objc_object {
Class _Nonnull isa  OBJC_ISA_AVAILABILITY;
};

/// A pointer to an instance of a class.
typedef struct objc_object *id;

即id类型其实是objc_object指针类型的别称。objc_object结构体同样也是包含了一个指向Class类型的指针。
继续看一下,Class isa指针的内部结构,如下

struct objc_class {
Class _Nonnull isa  OBJC_ISA_AVAILABILITY;//指向元类的Class指针

#if !__OBJC2__
Class _Nullable super_class                              OBJC2_UNAVAILABLE;//指向父类的Class指针
const char * _Nonnull name                               OBJC2_UNAVAILABLE;//类名
long version                                             OBJC2_UNAVAILABLE;//类的版本信息,默认为0
long info                                                OBJC2_UNAVAILABLE;//运行期使用的一些位标识
long instance_size                                       OBJC2_UNAVAILABLE;//该类的实例变量大小
struct objc_ivar_list * _Nullable ivars                  OBJC2_UNAVAILABLE;//属性列表
struct objc_method_list * _Nullable * _Nullable methodLists                    OBJC2_UNAVAILABLE;//方法列表
struct objc_cache * _Nonnull cache                       OBJC2_UNAVAILABLE;//缓存方法列表
struct objc_protocol_list * _Nullable protocols          OBJC2_UNAVAILABLE;//协议列表
#endif

} OBJC2_UNAVAILABLE;

typedef struct objc_class *Class;

Class其实就是一个objc_class类型的结构体指针。objc_class的结构体变量构成见上图,下面是objc_class类的super_class指针和isa元类指针的具体指向关系,请大家分清对象,对象的类,元类,根元类这些概念。


  1. 简述OC中的消息转发机制

  1. 响应链原理
//判断当前点击事件是否存在最优响应者(First Responder)
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event;
//判断当前点击是否在控件的Bounds之内
- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event;

第一个方法返回一个可以响应event触摸事件的UIView,第二个方法判断触摸点位在不在可相应范围之内的BOOL值。所以会衍生出一些问题,比如说“如何让一个父视图以外的子视图响应点击事件”,“如何只让一个UIView的圆形区域响应触摸事件”等等,在此由于篇幅限制,不再一一展开详述。下面这幅图简述了系统查找响应事件控件的流程。


  1. 手写一个block结构体声明

typedef void(^RBBlogDemoHandler)(void);


  1. RunLoop原理,RunLoop与线程的关系

  1. GCD与NSOperation两种管理多线程方式的异同点

  1. GCD的常用api

  1. GCD中的同步异步,串行并发的概念,GCD常见的线程死锁问题
dispatch_sync(dispatch_get_main_queue(), ^{
        NSLog(@"%@", @"123");
    });

这样的函数,就是典型的GCD死锁函数。 因为dispatch_sync阻塞的当前的线程,而当前线程是main_queue,也就是说是一个串行线程,当前线程只有先执行NSLog(@"%@", @"123")才能继续运行下去,但是当前线程又被阻塞掉了,无法向下继续执行,所以这就是一个死锁的GCD执行函数了。


  1. iOS中常用的线程锁有哪些,分别具有哪些特点?

  1. Father的子类Son,分别写出NSStringFromClass([self class]),NSStringFromClass([super class]),NSStringFromClass(self.superClass)的打印值

  1. KVO的原理

  1. runtime的机制和应用

19.MJExtension, MJRefresh, SDWebImage的实现原理


  1. NSTimer计时器是准确的吗,为什么?

  1. 类的分类和类的扩展的区别,类的分类的实现原理。

  1. iOS动态关联属性(objc_setAssociatedObject,objc_getAssocicatedObject)的实现原理

  1. Masonry的抗压缩属性和抗拉伸属性
[label1 setContentHuggingPriority:UILayoutPriorityRequired
                          forAxis:UILayoutConstraintAxisHorizontal];
[label2 setContentHuggingPriority:UILayoutPriorityDefaultLow
                          forAxis:UILayoutConstraintAxisHorizontal];
[label1 setContentCompressionResistancePriority:UILayoutPriorityDefaultLow
                                        forAxis:UILayoutConstraintAxisHorizontal];
[label2 setContentCompressionResistancePriority:UILayoutPriorityRequired
                                        forAxis:UILayoutConstraintAxisHorizontal];
  1. 加密的种类,对称加密和非对称加密

  1. 解释一下七层网络结构,三次握手协议和四次挥手协议

  1. http和https的区别

  1. https双向验证原理

  1. HTTP常用的头部字段,常见的返回状态码和意义

  1. @class和import以及include的区别

  1. weak对象的管理方式

  1. iOS的retain和release的操作是在编译期还是运行时进行的
- (void) setUserName:(UITextField *)userName { 
    [_userName release]; 
    _userName = [userName retain]; 
}

  1. +(void)load方法和+(void)initial方法的异同

iOS会在应用程序启动的时候调用load方法,在main函数之前调用 执行子类的load方法前,会先执行所有超类的load方法,顺序为父类->子类->分类 在load方法中使用其他类是不安全的,因为会调用其他类的load方法,而如果关系复杂的话,就无法判断出各个类的载入顺序,类只有初始化完成后,类实例才能进行正常使用 load 方法不遵从继承规则,如果类本身没有实现load方法,那么系统就不会调用,不管父类有没有实现(跟下文的initialize有明显区别) 尽可能的精简load方法,因为整个应用程序在执行load方法时会阻塞,即,程序会阻塞直到所有类的load方法执行完毕,才会继续 load 方法中最常用的就是方法交换method swizzling。

惰性调用,只有当程序使用相关类时,才会调用 运行期系统会确保initialize方法是在线程安全的环境中执行,即,只有执行initialize的那个线程可以操作类或类实例。其他线程都要先阻塞,等待initialize执行完。如果类未实现initialize方法,而其超类实现了,那么会运行超类的实现代码,而且会运行两次。initialize方法是线程安全的,可以用来设置内部数据,比如,某个全局状态,如数组、字典等无法在编译期初始化,可以放在initialize里面。


  1. UIViewController的生命周期方法调用顺序

  1. iOS中各类控件的继承树关系

  1. 如何化解NSTimer的循环引用关系

  1. 怎样管理第三方SDK,CocoaPods和Carthage的异同

  1. -(BOOL)isKindOfClass和-(BOOL)isMemberOfClass的区别

  1. 数据持久化的几种方式和对应的应用场景

  1. 如何实现一个完整的单例
#import "Singleton.h"
@interface Singleton()<NSCopying,NSMutableCopying>
@end

@implementation Singleton

static Singleton* _instance = nil;

+(instancetype) shareInstance
{
    static dispatch_once_t onceToken ;
    dispatch_once(&onceToken, ^{
        _instance = [[super allocWithZone:NULL] init] ;
        //不是使用alloc方法,而是调用[[super allocWithZone:NULL] init] 
        //已经重载allocWithZone基本的对象分配方法,所以要借用父类(NSObject)的功能来帮助出处理底层内存分配的杂物
    }) ;

    return _instance ;
}

+(id) allocWithZone:(struct _NSZone *)zone
{
    return [Singleton shareInstance] ;
}

-(id) copyWithZone:(NSZone *)zone
{
    return [Singleton shareInstance] ;//return _instance;
}

-(id) mutablecopyWithZone:(NSZone *)zone
{
    return [Singleton shareInstance] ;
}
@end

  1. iOS的系统单例有哪些?

  1. APP启动主要流程

  1. iOS的沙盒机制

作为一个开发者,有一个学习的氛围跟一个交流圈子特别重要,这是一个我的iOS开发交流群:130595548,不管你是小白还是大牛都欢迎入驻 ,让我们一起进步,共同发展!(群内会免费提供一些群主收藏的免费学习书籍资料以及整理好的几百道面试题和答案文档!)

上一篇 下一篇

猜你喜欢

热点阅读