iOS软件工程师必须会的面试题

1.请简述你对协议的理解
    协议是oc的一种写法, 和现实生活中的 劳动合同 协议 等是相似的, 主要目的是来规范对象的借口 , 只有方法的声明 ,实现是在遵守协议的类中  协议的方法分为必须实现和可选实现 , 规范不同类的行为  统一借口 (继承也可以达到统一接口的)

2.如何理解ARC自动引用计数机制
    ARC 是iOS中的内存管理机制  iOS 4 之后的 的一种自动管理方式  从iOS  不需要手动添加  retuin  +1  编译器会帮我们添加 Autorelease //NSAutoreleasePool *pool;-->arc下不能写 不能手动的调用 dealloc

3.如何理解 retain/copy/assign/release/autor elease/dealloc关键字
    retain 使对象的引用的计算+1 ;
     retain  使 对象的引用计数+1  
    copy 使 copy 对象调用copy的方法必须遵守nscopy  和nsmutablecopy  协议 方法
    assign 是直接赋值    不会使对象的引用计数减一 +1  ,
    release 是 事对象的引用计数减一 释放对象  
    autorelease  是延迟释放  ,他会把对象的地址放到离他最近的自动释放池中 没有-1 功能
    dealloc 是销毁对象 当我们的对象的引用计数减到0 的时候  会自动调用dealloc 销毁对象
           mvvm
4 .简述self.name  =  xxx 与 _name  = xxx 的区别
    (1)self.name  有getter 和sett er 方法
    (2)self.name 可以被kvo 监听到  (set 方法 和kvc方法)
    (3)self.name  考虑了内存管理  是一个对象指针
5.简述类别和继承 有什么联系 和区别
    类别:增加方法 可以打补丁 (不可增加成员变量,但可以通过运行时的方法)
    继承: 子类继承父类 子类  会拥有父类所以的方法
6. str    ong 好weak 的理解
        strong和weak是arc 自动内存管理的方法 strong 是强应用 可使对象的引用计数+1 , weak是弱引用 指针 所修饰的对象指针之接赋值,weak修饰的指针 在对象销毁的时候 指针赋值为nil
7. 简述weak和assign 有神马区别
    weak 修饰对象地址  - arc 语法, 在arc 中修饰对象 ,
    assign 直接赋值 ,一般修饰基本数据类型 assign  mrc 里既能修饰对象,也能修饰基本数据类型 , assign 在arc中只 修饰 基本数据类型
8. 如何实现ARC 和 MRC 的混合编程
    如果在ARC 工程中 加MRC   加 -fno-objc-arc
    如果在MRC 工程中 加 ARC  加 -fobjc-arc
9.oc 支持多继承吗
    不支持,但是可以通过协议来 实现这样的效果
10. OC 中变量默认是私有的吗 方法默认是私有的吗?
    (1)oc 中的变量默认是私有的  @pro
    (2)方法是共有的  对外不公开的可以通过选择器来实现 访问 , 这是oc的动态特性
    (3)如果想要实现的话 , 可以通过把他放在匿名内别里
11. #import .h  和#include 和@class  区别
    #include是c 的头文件 通常需要#ifnodef  和 #endif 条件编译  如果不进行条件编译的话 , 就会造成 多次包含这个头文件 ,从而导致 重复定义
    #import只会编译一次 ,可以确保头文件只会被导入一次
    @class 是前向引用声明  告诉编译器我后面有定义,放行
12.简述页面传值有哪些
    (1)属性传值:prote
    (2)代理,单例 ,  block,通知


20. 简述UITableView 的cell的复用机制
 //在使用cell 的时候我们一般都采用cell 复用机制 这样可以提高效率 节省空间
    /*
     1.饭店 就餐  碗筷  采用复用
     2.学生 教室里的电脑
     3.打飞机 中 子弹 循环复用
     */
    //可复用标识符
    static NSString *cellID = @"cellID";
    
    /*
     每次获取cell 先从可复用cell队列中获取,如果有可复用的那么就利用这个cell,如果没有可复用的再创建新的cell
     //刚开始可复用队列中是没有可复用的cell 的
     //创建 一屏+1个就够了
     当一个cell 从屏幕上看不到的时候就会把这个cell放入复用队列中
    
22.  



四 . 高频题目
    
1.苹果移动开发框架 cocoaTouch / cocoa
 
//////////////////////////////////////////////////////////////////////////////////////////////
  1. oc 语言的基本特点
    (1)oc做为一门面向对象的语言 自然具有面向对象的语言特性,如封装、继承、多态。他具有静态语言的特性(如C++),又有动态语言的效率(动态绑定、动态加载等)。整体来说,确实是一门不错的编程语言
现在,让我来想想OC的动态语言特性。OC的动态特性表现为了三个方面:动态类型、动态绑定、动态加载。之所以叫做动态,是因为必须到运行时(run time)才会做一些事情。
(1)动态类型
动态类型,说简单点就是id类型。动态类型是跟静态类型相对的。像内置的明确的基本类型都属于静态类型(int、NSString等)。静态类型在 编译的时候就能被识别出来。所以,若程序发生了类型不对应,编译器就会发出警告。而动态类型就编译器编译的时候是不能被识别的,要等到运行时(run time),即程序运行的时候才会根据语境来识别。所以这里面就有两个概念要分清:编译时跟运行时。
(2)动态绑定
动态绑定(dynamic binding)貌似比较难记忆,但事实上很简单,只需记住关键词@selector/SEL即可。先来看看“函数”,对于其他一些静态语言,比如 c++,一般在编译的时候就已经将将要调用的函数的函数签名都告诉编译器了。静态的,不能改变。而在OC中,其实是没有函数的概念的,我们叫“消息机 制”,所谓的函数调用就是给对象发送一条消息。这时,动态绑定的特性就来了。OC可以先跳过编译,到运行的时候才动态地添加函数调用,在运行时才决定要调 用什么方法,需要传什么参数进去。这就是动态绑定,要实现他就必须用SEL变量绑定一个方法。最终形成的这个SEL变量就代表一个方法的引用。这里要注意 一点:SEL并不是C里面的函数指针,虽然很像,但真心不是函数指针。SEL变量只是一个整数,他是该方法的ID。以前的函数调用,是根据函数名,也就是 字符串去查找函数体。但现在,我们是根据一个ID整数来查找方法,整数的查找字自然要比字符串的查找快得多!所以,动态绑定的特定不仅方便,而且效率更 高。
(3)动态加载
就是根据需求动态地加载资源。我对动态加载比较陌生,所以就没什么可总结的啦。等以后慢慢完善

1517 班 面试题
1. 什么是MVC , 你在工作中是怎么运行它的?
    mvc (Model View Controller) 模型(model) —视图(View) -  控制器(controller)
    M:是指数模型 , v :是指用户界面, C则是控制器  ,使用MVC 设计模型,可以把M和V 的实现代码的分离 ,从而使同一个程序可以使用不同的变现形式MVC是一个设计模式,它强制性的使应用程序的输入、处理和输出分开。使用MVC应用程序被分成三个核心部件:模型、视图、控制器。它们各自处理自己的任务。分层概念

为什么要使用 MVC
   首先,最重要的一点是多个视图能共享一个模型
    MVC的优点
(一)、低耦合性
  视图层和业务层分离,这样就允许更改视图层代码而不用重新编译模型和控制器代码,同样,一个应用的业务流程或者业务规则的改变只需要改动MVC的模型层即可。因为模型与控制器和视图相分离,所以很容易改变应用程序的数据层和业务规则。
二)、高重用性和可适用性
  随着技术的不断进步,现在需要用越来越 多的方式来访问应用程序。MVC模式允许你使用各种不同样式的视图来访问同一个服务器端的代码。它包括任何WEB(HTTP)浏览器或者无线浏览器 (wap),比如,用户可以通过电脑也可通过手机来订购某样产品,虽然订购的方式不一样,但处理订购产品的方式是一样的。由于模型返回的数据没有进行格式 化,所以同样的构件能被不同的界面使用。例如,很多数据可能用HTML来表示,但是也有可能用WAP来表示,而这些表示所需要的命令是改变视图层的实现方 式,而控制层和模型层无需做任何改变

三)、较低的生命周期成本
  MVC使开发和维护用户接口的技术含量降低。
 
(四)、可维护性
  分离视图层和业务逻辑层也使得应用更易于维护和修改。

(五)、有利于软件工程化管理
  由于不同的层各司其职,每一层不同的应用具有某些相同的特征,有利于通过工程化、工具化管理程序代码。

2.进程和线程有什么区别 ,他们存在什么联系?
    进程是什么?
程序并不能单独运行,只有将程序装载到内存中,系统为它分配资源才能运行,而这种执行的程序就称之为进程。程序和进程的区别就在于:程序是指令的集合,它是进程运行的静态描述文本;进程是程序的一次执行活动,属于动态概念
    进程与线程的区别
    •    进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位。
    •    线程是进程的一个实体, 是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源。
    •    一个线程可以创建和撤销另一个线程,同一个进程中的多个线程之间可以并

3.浅复制和深复制的区别


 浅 复 制:在复制操作时,对于被复制的对象的每一层复制都是指针复制。
   深 复 制:在复制操作时,对于被复制的对象至少有一层复制是对象复制。
   完全复制:在复制操作时,对于被复制的对象的每一层复制都是对象复制。

        注:1、在复制操作时,对于对象有n层是对象复制,我们可称作n级深复制,此处n应大于等于1。
             2、对于完全复制如何实现(目前通用的办法是:迭代法和归档),这里后续是否添加视情况而定,
                                暂时不做讲解。
             3、指针复制俗称指针拷贝,对象复制也俗称内容拷贝。
             4、一般来讲,
                              浅层复制:复制引用对象的指针。
                               深层复制:复制引用对象内容。
           这种定义在多层复制的时候,就显得模糊。所以本文定义与它并不矛盾。
            反而是对它的进一步理解和说明。          

retain:始终是浅复制。引用计数每次加一。返回对象是否可变与被复制的对象保持一致。

copy:对于可变对象为深复制,引用计数不改变;对于不可变对象是浅复制,
         引用计数每次加一。始终返回一个不可变对象。

mutableCopy:始终是深复制,引用计数不改变。始终返回一个可变对象。

不可变对象:值发生改变,其内存首地址随之改变。
   可变对象:无论值是否改变,其内存首地址都不随之改变。
   引用计数:为了让使用者清楚的知道,该对象有多少个拥有者(即有多少个指针指向同一内存地址)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章