超实用的ios面试技巧,90%的人都不知道……

移动互联网行业一直是社会发展的一个趋势,且这几年快速十分迅速,诸如BAT这些大型的互联网企业的用户也是主要以移动端用户为主。

iOS开发本身就属于移动开发,所以它依旧是目前热门的行业,今天小编就跟大家聊聊iOS面试必考的几大知识点

1

Objective-C

●你是否接触过OC中的反射机制?简单聊一下概念和使用

Class反射

通过类名的字符串形式实例化对象

Class class NSClassFromString@(@”student”);
Student *stu = [[class alloc ]init];

将类名变为字符串

Class class =[Student class];
NSString*className = NSStringFromClass(class);

SEL的反射

通过方法的字符串形式实例化方法

SEL selector = NSSelectorFromClass(@”setName”);
[stu perform Selector:selector withObject:@”Mike”];

将方法变成字符串

NSString FomrSelector(@selector*(setName:))

●编写一个函数,实现递归删除指定路径下的所有文件

+ (void)deleteFiles:(NSString *)path;{
   // 1.判断文件还是目录
  NSFileManager * fileManger = [NSFileManager defaultManager];
  BOOL isDir = NO;

  BOOL isExist = [fileManger fileExistsAtPath:path isDirectory:&isDir];
  if (isExist) {
    //2.判断是不是目录
    if (isDir) {
    NSArray * dirArray = [fileManger 
    contentsOfDirectoryAtPath:path error:nil];
       NSString * subPath = nil;
       for (NSString * str in dirArray) {
            subPath = [path stringByAppendingPathComponent:str];
            BOOL issubDir = NO;
            [fileManger fileExistsAtPath:subPath isDirectory:&issubDir];
            [self deleteFiles:subPath];
       }
   }else{
       NSLog(@"%@",path);
       [manager removeItemAtPath:filePath error:nil];
     }
  }else{
     NSLog(@"你打印的是目录或者不存在");
  }
}

2

Runloop&Runtime

●Runloop和线程有什么关系?

主线程的run loop默认是启动的

iOS的应用程序里面,程序启动后会有一个如下的main()函数

(arc,*argv[]){
@autoreleasepool{
Return UIApplicationMain(argc,argv,,NSStringFromClass([AppDelegate class]));
}
}

重点是UIApplicationMain()函数,这个方法会为mainthread设置一个NSRunLoop对象。这就解释了:为什么我们的应用可以在无人操作的时候休息,需要让它干活的时候又能立马响应。

对其它线程来说,runloop默认是没有启动的,runloop只在你要和线程有交互时才需要。在任何一个Cocoa程序的线程中,都可以通过以下代码来获取到当前贤臣的runloop。

NSRunLoop*runloop = [NSRunLoop currentRunLoop];

●Obiective-C如何对已有的方法,添加自己的功能代码以实现类似记录日志这样的功能?

+(NSString *)myLog

{
// 这里写打印行号,什么方法,哪个类调用等等
}

// 加载分类到内存的时候调用
  +(void)load

  {
  // 获取imageWithName方法地址
  Method description = class_getClassMethod(self, @selector(description));

  // 获取imageWithName方法地址
  Method myLog = class_getClassMethod(self, @selector(myLog));

  // 交换方法地址,相当于交换实现方式
  method_exchangeImplementations(description, myLog);
  }

3

Swift

●举例说明Swift里边有哪些是Objective-C中没有的?

Swift引入了在Objective-C中没有的一些高级数据类型,例如tuples(元祖),可以使你创建和传递一组数值。

Swift还引入了可选项类型(Optionals),用于处理变量值不存在的情况。可选项的意思有两种,一种变量是存在的,例如等于X,而是变量值根本不存在。Optionals类似于Objective-C中指向nil的指针、但是适用于所有的数据类型,而非仅仅局限于类,Optionals相比于Objective-C中nil指针更加安全简明,并且也是Swift诸多最大功能的核心。

4

KVO-KVC

●KVC的底层实现?

当一个对象调用setValue方法时,方法内部会做以下操作:

①检查是否存在相应key的set方法,如果存在,就调用set方法

②如果set方法不存在,就会查找与key相同名称并且带下划线的成员属性,如果有,则直接给成员属性赋值

③如果没有找到_key,就会查找相同名称的属性key,如果有就直接赋值

④如果还没找到,则调用valueForUndefinedKey:和setValue:forUndefinedKey:方法。

这些方法的默认实现都是抛出异常,我们可以根据需要重写它们。

●KVO的底层实现?

- kvo基于runtime机制实现。

- 使用了isa混写(isa-swizzling),当一个对象(假设是person对象,person的类是MYPerson)的属性值(假设person的age)发生改变时,系统会自动生成一个类,继承自MYPerson:NSKVONotifying_MYPerson,在这个类的setAge方法里面,调用[super setAge:age] [self willChangeValueForKey:@"age"] 和 [self didChangeValueForKey:@"age"],而这两个方法内部会主动调用监听者内部的 - (void)observeValueForKeyPath 这个方法。

- 想要看到NSKVONotifying_MYPerson很简单,在self.person.age = 20; 这里打断点,在调试区域就能看到_person->NSobject->isa=(Class)NSKVONotifying_MYPerson,同时我们在 self.person = [[MYPerson alloc]init];后面打断点,看到_person->NSObject->isa=(Class)MYPerson,由此可见,在添加监听者之后,person类型已经由MYPerson被改变成NSKVONotifying_MYPerson

5

结语

有人说iOS行情越来越难,其实这种说话并不准确,在移动网络愈加普及的今天,iOS程序员失业的情况是不会出现的。目前市场上iOS初级开发者人满为患,但中级高级的开发者依旧非常稀缺,在这个时候,就需要提高自己的技术。

原文发布于微信公众号 - IT大咖说(itdakashuo)

原文发表时间:2018-03-23

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏微信终端开发团队的专栏

Kotlin-Android的另一番风味

微信 订阅号助手 的Android App项目首次尝试使用Kotlin进行大规模的业务开发(483个Kt文件,3.8W行不包含空行的Kt代码),一开始接触Ko...

9.2K50
来自专栏CDA数据分析师

10个应该早点知道的Python技巧

我的这一生都在编程,但是我没有成为一名程序员。最初,我的大部分工作都是用Visual Basic来完成的,还包括一些其它语言工具,比如R语言,C语言、JavaS...

30690
来自专栏数据结构与算法

震惊!Vector两行代码求逆序对,六行代码过普通平衡树

Vector两行代码求逆序对 背景:济南集训Day7上午T2,出了一道逆序对的裸题,SB的我没看出是逆序对来,于是现场推了一个很刁钻的求逆序对的方法 首先...

30650
来自专栏高性能服务器开发

API设计原则 – QT官网的设计实践总结

原文链接:API Design Principles – Qt Wiki 链接:(http://wiki.qt.io/API_Design_Principles...

32220
来自专栏陈满iOS

iOS开发·必会的算法操作:字符串数组排序+模型对象数组排序

为了给字符串数组排序,除了用C/C++的基本办法,iOS开发者更应该学会利用苹果专门为NSArray 排序提供的sortedArrayUsingComparat...

12610
来自专栏liulun

Nim教程【五】

这是国内第一个关于Nim的系列教程 先说废话 业内的人认为能够直接操作系统硬件的语言才称得上系统级的编程语言 常见的系统级编程语言有:汇编、C、C++、D、GO...

29680
来自专栏iOS

深入理解苹果系统(Unicode)字符串的排序方法

本文主要讲述下载苹果系统-方法所引发的对排序规则的深入研究。

47470
来自专栏林德熙的博客

C# Find vs FirstOrDefault

需要知道,两个方法都是 Linq 的方法,使用之前需要引用 Linq 。对于 List 等都是继承可枚举Enumerable这时获取第一个元素可以使用First...

19110
来自专栏嵌入式程序猿

sizeof应用的小陷阱

本篇笔记主要介绍在项目开发中,使用sizeof的一个要注意的地方。分别在8位机microchip PIC18F46K22, 16位机microchip ds...

37580
来自专栏狮乐园

多维数组取值问题

给予一个多维数组和一个描述取值路径的一维数组, 通过调用函数f返回取值路径描述的值,如 f([[1, 2], [3, 4], [5, 6]], [0, 0]) ...

17430

扫码关注云+社区

领取腾讯云代金券