zoukankan      html  css  js  c++  java
  • iOS面试经历(个人)

    1.OC的runtime运行机制
    1> runtime,运行时机制,它是一套C语言库
    2> 实际上我们编写的所有OC代码,最终都是转成了runtime库的东西,比如类转成了runtime库里面的结构体等数据类型,方法转成了runtime库里面的C语言函数,平时调方法都是转成了objc_msgSend函数(所以说OC有个消息发送机制,消息的发送是在runtime时执行的)
    3> 可以说runtime是OC的底层实现,是OC的幕后执行者
    4> 有了runtime库,能做什么事情呢?runtime库里面包含了跟类、成员变量、方法相关的API,比如获取类里面的所有成员变量,为类动态添加成员变量,动态改变类的方法实现,为类动态添加新的方法等

    2.为什么NSString只能使用copy属性,不能使用retainNSString也是对象哦!

    1、如果使用retain,只是引用计数加1,并没有生成新的对象,所以效率好;

    2、但是使用copy安全,因为NSStringNSMutableString的基类,如果将NSMutableStringretain的形式赋值给NSString后,后续修改NSMutableString会导致NSString内容的变化,这通常不是我们希望的,所以使用copy

     

    3.frameboundscenter的使用场景

     

    一般来说,bounds属性比较少用,通常使用frame来设置视图的大小和位置,使用center来改变(移动)视图的位置(也可用frame来改变位置)。另外,对视图进行旋转、缩放也都是相对于center进行操作的。

     

    frameboundsUIView中的两个属性(property)

     

    frame指的是:该view在父view坐标系统中的位置和大小。(参照点是父亲的坐标系统)

     

    bounds指的是:该view在本身坐标系统中 的位置和大小。(参照点是本身坐标系统)

     

    -(CGRect)frame{

     

      return CGRectMake(self.frame.origin.x,self.frame.origin.y,self.frame.size.width,self.frame.size.height);

     

     }

     

     

     

    -(CGRect)bounds{

     

      return CGRectMake(0,0,self.frame.size.width,self.frame.size.height);

     

     }

     

    注意:很明显,bounds的原点是(0,0)点(就是view本身的坐标系统,默认永远都是00点,除非调用了setbounds函数),而frame的原点却是任意的(相对于父视图中的坐标位置)。

     

    4.MVC的模式?

     

           Controller(控制中心,大管家)

     

    Model (模型,封装数据)            view(视图,显示数据)

     

    控制器可以直接和modelview交互,初始化model,把model传递给view显示view上面显示什么取决于modelmvc模式实现了modelview的代码分离,各自负责各自的业务逻辑。

    5.代理模式

    1什么是代理?委托代理(degegate),顾名思义,把某个对象要做的事情委托给别的对象去做。那么别的对象就是这个对象的代理,代替它来打理要做的事。

    2)代理的使用场景?

    a.对象A内部发生事情,想通知对象B

    b.对象B想监听对象A内部发生了什么事情;

    c.对象A想在自己方法中调用对象B的某个对象;

    d.对象A想传数据给对象B

     

    3)代理的目的?

     

         1> 两个对象之间传递数据和消息

     

         2> 解耦,拆分业务逻辑

     

    6.通知模式?

     

    1什么是通知?

     

    每一个应用APP都有一个通知中心实例,负责协助不同对象之间的消息通信

     

    任何一个对象都可以向通知中心发布通知,描述自己在做什么。

     

    2)代理和通知的选择?

     

    共同点:利用通知和代理都能完成对象之间的通信,都可以传递数据和消息。

     

    不同点:

     

    代理:一对一关系

     

    通知:多对多关系

     

    3只能使用delegate的情况不能使用NSNotification的情况?需要返回值的情况

     

    7. What are KVO and KVC?

     

       1> KVC是键值编码,可以通过一个字符串的key(属性名)修改对象的属性值

     

    方法有valueForKey:setValue:forKey:,支持键路径keypath

     

       2> KVO是键值监听,可以监听一个对象属性值的改变

     

    底层实现问题:KVO内部实现原理?

     

    1> KVO是基于runtime机制实现的

     

    2> 当某个类的对象第一次被观察时, 系统就会在运行期动态地创建该类的一个派生类,在这个派生类中重写基类中任何被观察属性的 setter 方法。 

     

    派生类在被重写的 setter 方法实现真正的通知机制(Personà NSKVONotifying_Person)

     

    8.单例模式?

     

    1什么是单例?What is Singleton?


     

    单例:保证程序运行过程中,永远只有一个对象实例

     

    目的是:全局共享一份资源、节省不必要的内存开销

     

    9.IBActionIBOutlet的区别?

     

    IBAction原名是Interface Builder,用来操作建立关系,本质就是一个void

     

    只有返回值声明为IBAction方法,才能跟storyboard控件进行连线。

     

    IBOutlet用来和界面上元素建立关系,用来获得修改界面控件属性.

     

    10.iOS开发中, .h & .m的区别

     

      .h 是程序接口,对外提供方法声明

     

    .m 是程序的实现,负责方法的具体实现

     

    11. 代理delegateNSNotificationKVCKVO的区别?

     

    Delegate:代理或者委托实质上是一种设计模式中的代理模式,是对象之间传递信息的一种方式,这种模式用于一个对象“代表”另外一个对象和程序中其他的对象进行交互。这是一种一对一的关系,delegate的接收者可以向这个对象返回消息。简单的说,把一个类自己需要做的一部分事情,让另一个类(也可以就是自己本身)来完成。

     

    NSNotification:通知中心实质是设计模式中的观察者模式,是一种一对多的关系,消息发送者只负责发送消息,不能接收消息。

     

     

     

     

    KVC: KVCKeyValueCoding的简称,它是一种可以直接通过字符串的名字(key)来访问类属性的机制。而不是通过调用SetterGetter方法访问。关键方法定义在:NSKeyValueCodingprotocol

     

    KVC支持类对象和内建基本数据类型。

     

    获取值

     

    valueForKey:,传入NSString属性的名字。

     

    valueForKeyPath:,传入NSString属性的路径,xx.xx形式。

     

    valueForUndefinedKey它的默认实现是抛出异常,可以重写这个函数做错误处理。

     

    修改值

     

    setValue:forKey:

     

    setValue:forKeyPath:

     

    setValue:forUndefinedKey:

     

    setNilValueForKey:当对非类对象属性设置nil时,调用,默认抛出异常。

     

    一对多关系成员的情况

     

    mutableArrayValueForKey:有序一对多关系成员 NSArray

     

    mutableSetValueForKey:无序一对多关系成员 NSSet

     

    KVO: KVO,即:Key-Value Observing,它提供一种机制,当指定的对象的属性被修改后,则对象就会接受到通知。简单的说就是每次指定的被观察的对象的属性被修改后,KVO就会自动通知相应的观察者了。

     

    使用方法 

     

    1. 注册,指定被观察者的属性, 

     

    2. 实现回调方法 

     

    3. 移除观察

    12 以+scheduledTimerWithTimeInterval的方式触发的timer,在滑动页面上的列表时,timer会暂定回调,为什么?如何解决?

    13 protocol和delegate有什么类似的区别?如何实现一个delegate?

    14 简述一下,app在ios前,后台运行时有什么不同?

    15 如何使开发出的app能比较省电?

    16 假设在空指针上调用方法,会发生什么?

    17 在oc中,如何实现线程同步?

    18 ios支不支持多任务?ios9以下不支持

    19 如何将iosapp进行多语言发布?

    20 app的状态有多少种?

     

  • 相关阅读:
    csrf攻击 xss区别
    同源策略
    JavaScript中数组的排序——sort()
    箭头函数
    bind(),call(),apply()
    异步操作
    slice(), splice(),split(),indexOf(),join(),replace()
    04-Linux系统编程-第01天(文件IO、阻塞非阻塞)
    03-Linux命令基础-第03天(makefile、静态库、动态库、gdb调试工具)
    02-Linux命令基础-第02天(压缩包管理、服务器搭建与使用、vim)
  • 原文地址:https://www.cnblogs.com/linxiu-0925/p/5030822.html
Copyright © 2011-2022 走看看