iOS面试题,持续更新...

作者: pingui | 来源:发表于2016-02-18 19:15 被阅读2445次

    C 部分

    1.static 关键字的作用?

    1. 第一个作用:隐藏。 当我们同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性。
    2. static的第二个作用是保持变量内容的持久。存储在静态数据区的变量会在程序刚开始运行时就完成初始化,也是唯一的一次初始化。共有两种变量存储在静态存储区:全局变量和static变量,只不过和全局变量比起来, static可以控制变量的可见范围,说到底static还是用来隐藏的。
    3. static的第三个作用是默认初始化为0。其实全局变量也具备这一属性, 因为全局变量也存储在静态数据区。在静态数据区,内存中所有的字节默认值都是0x00,某些时候这一特点可以减少程序员的工作量。

    2.线程与进程的区别和联系?

    一个进程可以由一个或者多个线程组成, 进程和程序并不是一一对应的,一个程序执行在不同的数据集上就成为不同的 进程,可以用进程控制块来唯一地标识每个进程。而这一点正是程序无法做到的,由于程序没有和数据产生直接的联系,既使是执行不同的数据的程序,他们的指令的集合依然是一样的,所以无法唯一地标识出这些运行于不同数据集上的程序。一般来说,一个进程肯定有一个与之对应的程序,而且只有一个。而一个程序有可能没有与之对应的进程(因为它没有执行),也有可能有多个进程与之对应(运行在几个不同的数据集上)。

    3.堆和栈的区别?

    1. 栈区(stack)― 由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
    2. 堆区(heap) ― 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。

    4.C语言如何判断两个单向无环链表是否相交?

    只需判断两个链表的尾节点地址是否相同,相同则相交,不同则不相交

    5.程序在内存中运行时,内存分几个区,各自用途?

    1. 栈 --有编译器自动分配释放。
    2. 堆 -- 一般由程序员分配释放,若程序员不释放,程序结束时可能由 OS 回收
    3. 全局区(静态区) -- 全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始 化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束释放。
    4. 另外还有一个专门放常量的地方。程序结束释放。

    6.引用与指针有什么区别?

    指针指向一块内存,它的内容是所指内存的地址;引用是某块内存的别名

    1. 指针是一个实体,而引用仅是个别名;
    2. 引用使用时无需解引用(*),指针需要解引用;
    3. 引用只能在定义时被初始化一次,之后不可变;指针可变;
    4. 引用没有 const,指针有 const;
    5. 引用不能为空,指针可以为空;
    6. “sizeof 引用”得到的是所指向的变量(对象)的大小,而“sizeof指针”得到的是指针本身(所指向的变量或对象的地址)的大小;
    7. 指针和引用的自增(++)运算意义不一样;
    8. 从内存分配上看:程序为指针变量分配内存区域,而引用不需要分配内存区域。

    7.编程:
    1.请问运行完Test函数后,会有什么样的结果。
    (1)

    void GetMemory(char *p)
    {
        p = (char *)malloc(100);
    }
    void Test(void)
    {
        char *str = NULL;
        GetMemory(str);
        strcpy(str, "hello world");
        printf(str);
    }
    

    请问运行Test函数会有什么样的结果?
    答:程序崩溃。
    因为GetMemory并不能传递动态内存, Test函数中的 str一直都是 NULL。 strcpy(str, "hello world");将使程序崩溃。

    (2)

    char *GetMemory(void)
    {
        char p[] = "hello world";
        return p;
    }
    void Test(void)
    {
        char *str = NULL;
        str = GetMemory();
        printf(str);
    }
    

    请问运行Test函数会有什么样的结果?
    答:可能是乱码。
    因为GetMemory返回的是指向“栈内存”的指针,该指针的地址不是 NULL,但其原先的内容已经被清除,新内容不可知。

    (3)

    void GetMemory2(char **p, int num)
    {
        *p = (char *)malloc(num);
    }
    void Test(void)
    {
        char *str = NULL;
            GetMemory(&str, 100);
            strcpy(str, "hello");
            printf(str);
    }
    

    请问运行Test函数会有什么样的结果?
    答:
    (1)能够输出hello
    (2)内存泄漏

    (4)

    void Test(void)
    {
        char *str = (char *) malloc(100);
        strcpy(str, “hello”); 
        free(str);
        if(str != NULL)
        {
            strcpy(str, “world”);
                    printf(str);
        }
    }
    

    请问运行Test函数会有什么样的结果?
    答:篡改动态内存区的内容,后果难以预料,非常危险。 因为free(str);之后,str成为野指针,if(str != NULL)语句不起作用。

    2.编写strcpy函数
    已知strcpy函数的原型是 char *strcpy(char *strDest, const char *strSrc);其中strDest是目的字符串,strSrc是源字符串。
    (1)不调用C++/C的字符串库函数,请编写函数 strcpy

    char *strcpy(char *strDest, const char *strSrc)
    {
        assert((strDest!=NULL) && (strSrc !=NULL)); 
            char *address = strDest;
            while( (*strDest++ = * strSrc++) != ‘\0’ )NULL ;
            return address ;
    }
    

    (2)strcpy能把strSrc的内容复制到strDest,为什么还要char * 类型的返回值?
    答:为了实现链式表达式。
    例如

    int length = strlen( strcpy( strDest, “hello world”) );
    
    #include <stdio.h> 
    int main()
    {
        int a = 0x0101;
            int b = 0x0202;
            int c;
            c = a & (~b);
            c = c | b;
        printf("%x,%d\n",c,c);
        return 0;
    }
    

    答案: 303,771

    4.完成下面函数以实现使用辗转相除法获取两个数(假设两个数都大于0)的最大公约数

    example: gcd(20,5 ) = 5. gcd(3,10 ) = 1. gcd(1620,1280 )= 20.
    
    unsigned int gcd(unsigned int a,unsigned int b)
    {
        int c = 0;
            if(m % n == 0) c = n;
            else
            c = gcd(n, m % n);
            return c;
    } 
    

    5.用嵌套方式写一个函数,函数返回N的阶层,要求尽量写完整

    int fun(int n)
    {
        if (n == 1)
            return n;
        return n * fun(n - 1);
    }
    

    6.请写出下列数据类型的范围 char, unsigned char, short, int
    答:

    char (-127~128) unsigned char(0~255) short(-2^16-1 ~2^16)
    int(-32768~32767) 
    

    7.请写出下面函数的返回值

    char fuc1()
    {
        unsigned int a = 6;
        int b = -12;
        return(a + b > 6) ? 1 : 0;
    }
    
    #define SQP(x)(x*x) 
    int fuc2()
    {
            int a = 3;
            return SQR(a+2);
    }
    

    答:1 11

    8.请计算下列结构所占字节数

    Typedef structYouKnow
    {
        int id;
        short age;
        char level;
    }
    

    答:8

    9.关键字 const 有什么含义?

    const 修饰谁,谁在整个程序运行过程中不能变

    10.下方代码输出结果为

    main()
    {
        int a[5] = {1, 2, 3, 4, 5};
        int *ptr = (int *)(&a+1); 
            printf(“%d%d”, *(a+1), *(ptr-1));
    }
    

    答:2, 5

    11.用 c/c++实现冒泡排序

    void swap_sort(int *p, int n)
    {
        int i, j;
        int tmp;
        for(i=0; i<n-1; i++){
            for(j=0; j<n-1-i; j++){
                if(p[j]>p[j+1]){
                    tmp=p[j];
                    p[j]=p[j+1];
                    p[j+1]=tmp;
                }
            }
        }
    }
    

    12.用嵌套的方式写一个函数,该函数返回 N 的阶乘(N!=12..*N)

    int func(int n)
    {
        if (n==1) return 1; 
            return n * func(n-1);
    }
    

    OC

    1.Objective-C可以实现多继承吗?可以实现多个接口吗?Category是什么?重写一个类的方式是用继承好还是用分类好?为什么?

    2.OC使用协议实现多继承,可以遵守多个协议实现多接口。category是OC中的类别,类别是用于给一个现有类添加新方法。重写类一般采用继承的方式,分类(类别)在给以个类添加同名方法后,会造成原有类中方法的失效,而继承重写的方法,依然可以在使用父类对象调用该方法。

    3.定义属性的时候,什么时候使用retain/copy/assign?写一个setter方法, 用于完成@property(nonatomic,retain) NSString* name; 写一个setter方法, 用于完成@property(nonatomic,copy) NSString* name;
    答:retain 用于保留对象的引用计数,在使用retain声明的属性做赋值的时候,成员变量指针会保留被赋值对象的引用计数。
    copy 声明的属性,在使用属性赋值的时候会,成员指针会指向新副本,这个副本是一个不可变副本,不论赋值对象是不是可变的。
    assign 用于基本数据类型的属性声明,不涉及到内存管理的问题,也是缺省参数

    retain声明的属性的setter方法展开
    - (void)setName:(NSString*)name {
          if(_name != name)
             {
                  [_name release];
                  _name = [name retain];
             }
    }
    
    copy声明的属性的setter方法展开
    - (void)setName:(NSString*)name {
          if(_name != name)
             {
                  [_name release];
                  _name = [name copy];
             }
    }
    

    4.什么时候使用NSMutableArray/什么时候使用NSArray?
    答:NSMutableArray 一般在需要随时更改数组结构的时候使用 NSArray 一般用于保存一些不需要修改逻辑的数据

    5.实现字符串“I LOVE CHINA”反串成“CHINA LOVE I”

    6..pch 文件的作用
    答:.pch 表示"precompiled header",这是一个你工程要用到的来自于外部框架的头文件列表。Xcode 将编译这些头文件,这将减少你在选择 Build 或 Build and Go 时编译项目的时间。通常用到的头文件已经自动包含了 pch,系统编译每个 cpp 文件前,都会先 include 这个文件。这样就节省了添加include 的时间,相当于加速编译。还可以在这里面放入宏,在整个工程中都可以用。

    7.怎样解决重复编译

    #ifndef _DEBUG 
    #ifdef USE_MYLIB ......
    #endif
    

    8.awakeFromNib 与 viewDidLoad 区别
    答:
    awakeFromNib
    当.nib 文件被加载的时候,会发送一个 awakeFromNib 的消息到.nib 文件中的每个对象,每个对象都可以定义自己的 awakeFromNib 函数来响应这个消息, 执行一些必要的操作。也就是说通过 nib 文件创建 view 对象时执行awakeFromNib 。
    viewDidLoad
    当 view 对象被加载到内存是就会执行 viewDidLoad,所以不管通过 nib 文件还是代码的方式创建对象都会执行 viewDidLoad。

    9.LayoutSubviews 何时会被调用?
    答:当要调整 subViews 时候,需要重写 layoutSubviews 方法。

    1. 初始化 init 方法时候不会触发。
    2. 滚动 UIScrollView 时会触发
    3. 旋转 UIScreen 时会触发
    4. 当改变 view 的值时候会触发,前提是 frame 前后值发生了变化
    5. 当改变 UIview 的大小时候会触发

    10.public/private/protected 的具体区别
    答:public 公共,加上这个修饰的类或属性,可以在同一个包或者别的包里面访问 private 私有的,加上这个修饰的类或属性,只能在同类里访问,同包和别的包不能访问。
    protected 保护,加上这个修饰的类或属性,只能在类和同包访问,别的包不能访问。

    11.ARC 是什么?
    答:ARC 是 iOS 5 推出的新功能,全称叫 ARC(Automatic Reference Counting)。 简单地说,就是代码中自动加入了 retain/release,原先需要手动添加的用来处理内存管理的引用计数的代码可以自动地由编译器完成了。
    该机能在 iOS 5/ Mac OS X 10.7 开始导入,利用 Xcode4.2 可以使用该机能。 简单地理解 ARC,就是通过指定的语法,让编译器(LLVM 3.0)在编译代码时, 自动生成实例的引用计数管理部分代码。有一点,ARC 并不是 GC,它只是一种 代码静态分析(Static Analyzer)工具。

    12.写一个“标准”宏,这个宏输入两个参数并返回较小的

    #define MIN(X,Y) ((X)>(Y)?(Y):(X))
    

    13.Objective-c 中有多重继承么?不是的话有声明替代方式?
    答:没有多继承,可以通过协议模拟多继承

    14.Objective-c 中有私有方法吗?私有变量呢?
    答:没有私有方法,但可以将方法直接实现在.m 文件中不在.h 文件中声明时,外部也不能访问。有私有变量。

    15.iPhone OS 中有没有垃圾回收?
    答:没有

    16.常见的 object-c 的数据类型有哪些,和 c 的基本类型有什么区别?
    答:常见的 object-c 的数据类型有 NSInteger、CGFloat、NSString、 NSNumber、NSArray、NSData,NSInteger 会根据系统是 32 位还是 64 位来决定 是本身是 int 还是 Long,
    CGFloat 会根据系统是 32 位还是 64 位来决定是本身是 float 还是 double,NSString、NSNumber、NSArray、NSData 都是指针类型的对象,在堆中分配空间,而 c 语言中的 char,[]等都是在栈中分配空间

    17.id 声明的对象有什么特性?
    答:id 声明的对象具有运行时的特性,即可以指向任意类型的 objcetive-c 的对象。

    18.想 nil 对象发送消息会发生什么?
    答:在 Objective-C 中向 nil 发送消息是完全有效的,只是在运行时不会有任何作用。

    19.什么是 block?block 实现原理?
    答:block 是一个特殊的 OC 对象, 它建立在栈上, 而不是堆上, 这么做一个是为性能考虑,还有就是方便访问局部变量。默认情况下 block 使用到的局部变量都会被复制,而不是保留。所以它无法改变局部变量的值。如果在变量面前加上__block, 那么编译器回去不会复制变量, 而是去找变量的地址, 通过地址来访问变量, 实际上就是直接操作变量。另外 block 是在栈上分配的, 所以一旦离开作用域, 就会释放, 因此如果你要把快用在别的地方, 必须要复制一份。 block 是不能保留的, retain 对块没有意义。

    20.C++和 OC,JAVA 和 OC 之间的区别?
    答:C++是功能强大,丰富的面向对象编程语言,具有私有、公有、保护权限的三种
    成员变量和成员方法,具有私有、公有、保护三种继承方式,具有重写,重载, 虚函数,虚基类等多态方式,通过虚基类实现代理回调。自定义类可以没有父 类。另外具备向量,模板,友元,重载运算符等多种独特语法
    Obj-C 是针对 mac OS 和 iOS 设备应用程序开发的专属编程语言,采用动态继承, 消息方法机制,没有真正的重写机制,没有私有方法,继承方式为公有,具备协议,类别,Block 等独有的语法,万用父类为 NSObject
    JAVA 是老牌的面向对象语言,编写的程序在 JAVA 虚拟机上运行,真正实现了一次编译到处运行,具有复杂的内存回收机制,单继承模式,接口语法类似 Obj-C 的协议。

    21.抽象与接口的区别?
    答:声明方法的存在而不去实现它的类被叫做抽象类(abstract class),它用于要创建一个体现某些基本行为的类,并为该类声明方法,但不能在该类中实现该类的情况。不能创建 abstract 类的实例。然而可以创建一个变量,其类型是一个抽象类,并让它指向具体子类的一个实例。不能有抽象构造函数或抽象 静态方法。Abstract 类的子类为它们父类中的所有抽象方法提供实现,否则它们也是抽象类为。取而代之,在子类中实现该方法。知道其行为的其它类可以 在类中实现这些方法。接口(interface)是抽象类的变体。在接口中,所有方法都是抽象的。多继承性可通过实现这样的接口而获得。接口中的所有方法都是抽象的,没有一个有程序体。接口只可以定义 static final 成员变量。接口的实现与子类相似,除了该实现类不能从接口定义中继承行为。当类实现特殊接口时,它定义(即将程序体给予)所有这种接口的方法。然后,它可以在实现了该接口的类的任何对象上调用接口的方法。由于有抽象类,它允许使用接口名作为引用变量的类型。通常的动态联编将生效。引用可以转换到接口类型或从接口类型转换,instanceof 运算符可以用来决定某对象的类是否实现了接口。

    22.nil 与 NULL 的区别?
    答:从 Objective-C 语言的官方说法上看,nil 表示指向对象的指针即所谓对象的引用为空,NULL 表示指向基础类型变量即 C 语言变量的指针为空。如果在非 ARC 程序的编写过程中,两个空是可以互换的,但是在 ARC 环境下,普通指针和对象引用被严格限制,不能交换使用,因此也应尽量不互换使用 nil 与 NULL

    23.BOOL 与 bool 的区别?
    答:bool 是 C 语言 C99 标准中增添的变量类型,Object-C 仅仅是从 C 语言继承了这 种类型,该类型有 true 和 false 两个值,表示真和假。BOOL 是 Obj-C 独有的布尔类型,有 YES 和 NO 两个值,分别是 1 和 0 的宏。Obj-C 中同时认为所有非 0 的值都是真值,0 为假值。

    24.OC 如何实现私有方法?
    答:Obj-C 语法中并没有私有方法的概念,但是由于 Obj-C 是通过导入其他类的头 文件来获取其他类所拥有的成员方法的声明,因此可以采用编写方法时,不声明,或仅在.m 文件中的匿名类别中声明的方式,使方法对外不可见,即可达到方法私有化的目的。但是外部类仍然可以通过@selector 来访问确实存在的私有方法,因此严格来讲 Obj-C 确实不能真正实现方法私有化

    25.NSString 和 NSMutableString 的区别
    答:NSString 是一个不可变的字符串对象。这不是表示这个对象声明的变量的值不 可变,而是表示它初始化以后,你不能改变该变量所分配的内存中的值,但你 可以重新分配该变量所处的内存空间。而 NSMutableString 是可变的,意味着 你可以追加它的内存空间,或者修改它所分配的内存空间中的值。

    26.关于语句 NSString * str= [[NSData alloc]init],编译和运行str分别代表什么对象?
    答:首先,声明 NSString *str 是告诉编译器,str 是一个指向某个 Objective-C 对象的指针。因为不管指向的是什么类型的对象,一个指针所占的内存空间都是固定的,所以这里声明成任何类型的对象,最终生成的可执行代码都是没有区别的。这里限定了 NSString 只不过是告诉编译器,请把 str 当做一个 NSString 来检查,如果后面调用了非 NSString 的方法,会产生警告。 接着,你创建了一个 NSData 对象,然后把这个对象所在的内存地址保存在 str 里。那么运行时,str 指向的内存空间就是一个 NSData 对象。你可以把 str 当做一个 NSData 对象来用。

    27.socket 通信的几个关键步骤
    面向连接的 socket 通信就像与对方打电话,首先需要通过电话建立一个连接, 连接建立好之后,彼此才能双向通信。它有几个关键步骤 服务器端通常以守护进程的方式实现:

    1. 创建守护进程
    2. 获取或注册服务
    3. 创建 socket 并绑定地址
    4. 开始监听
    5. 接收客户端连接请求
    6. 进行数据传输
      客户端
    7. 获取或注册服务
    8. 创建 socket
    9. 发送连接请求

    29.类别意义? 与继承的区别?
    答:当我们添加头文件以后,对已知的类,会自动提示你对这个类添加的方法
    主要用途,对于原生不会造成破坏,使用原生就可以提示出你的方法

    30.Core Foundation 中提供了哪几种操作 Socket 的方法?
    答:CFNetwork、CFSocket 和 BSD Socket

    31.用 id 声明的对象有什么特性?
    Ø 没有*号
    Ø 动态数据类型
    Ø 可以指向任何类的对象(设置是 nil),而不关心其具体类型
    Ø 在运行时检查其具体类型
    Ø 可以对其发送任何(存在的)消息

    32.self.name=“object” name=“object”有什么区别?
    答:前者实际上是调用了set方法给变量赋值 而后者是直接给变量赋值

    33.shell中,将command1的输出作为command2的输出应该使用的命令是? 重定向命令>
    command1>command2

    34.下面的数据结构中不属于线性结构的是:栈,链表,二叉树,线性表
    线性结构:栈,链表,线性表
    非线性结构:二叉树

    35.oc中有没有多继承,如果没有用什么方法替代?
    答:没有 用协议代替多继承

    36.常见的Objective-C的数据类型有哪些,和C的基本数据类型有什么区别? 答:OC中常用数据类型有 NSArray,NSDictionary,NSData,NSString,NSMutbleString等等,和C的最大区别为OC中的类型是类类型,需要实例化对象才能用。C中是一般数据类型直接操作内存空间

    37.C语言中指针与数组的区别
    答:指针是变量可以修改指向的方向,数组名是地址常量,不能被修改

    38.new delete malloc free 的含义
    答:c++:new申请内存, delete释放掉指针指向的内存 c:malloc 动态申请内存,free 释放指针指向的内存

    39.常引用什么时候使用?
    答:如果既要利用引用提高程序的效率,又要保护传递给函数的数据不在函
    数中被改变,就要使用常引用

    40.c/oc/c++有什么区别和联系?
    答:C 相对于 C++和 OC 而言更偏重于逻辑算法,这是因为 C 是面向过程,C++ 和 OC 都是面向对象。C 和 C++的联系:C 是 C++的一个自洽子集,C++是 C 的超 集,OC 是 C 的扩展,C++和 OC 基本兼容 C 的语法。

    41.const 的用法
    答:const 修饰变量表示该变量是只读变量(有些人管它叫常量),即只能引用而不能修改。const int *p;表示指针变量 P 指向的数据不能改
    int *const p;表示指针变量 P 的值不能改,或者说是指针 P 的指向不能改

    42.[pool release]和[pool drain]有什么区别?
    答:drain 和 release 都会促使自动释放池对象向池内的每一个对象发送release消息来释放池内对象的引用计数,但是release触发的这个操作, 不会考虑对象是否需要release,而drain会在自动释放池向池内对象发送 release消息的时候,考虑对象是否需要release

    43.自动释放池和 GC 一样吗,iphone 有没有 GC ?
    答:在引用计数环境下,ios 是没有垃圾回收的,自动释放池是 oc 中管理内存的一种方式,它和 gc 是本质区别的,自动释放池管理内存的前提是,必须把要管理内存的对象加入池内,才会生效。而 gc 是不断检测当前程序中是否有不再使用的内存进而释放。

    44.当A类中的某个方法执行到某处时,这时想在B类中执行某个方法,如何做? 并做简单说明
    答:用代理执行代理方法
    说明:在b类中实现协议方法,设置a的代理为b,在指定方法内调用代理的协议方法

    45.类别的作用?
    答案:category 可以在不获悉,不改变原来代码的情况下往里面添加新的方法,只能添加,不能删除修改。 并且如果类别和原来类中的方法产生名称冲突,则类别将覆盖原来的方法,因为类别具有更高的优先级。
    类别主要有3个作用: (1)将类的实现分散到多个不同文件或多个不同框架中。 (2)创建对私有方法的前向引用。 (3)向对象添加非正式协议。

    46.简述extern C的作用
    答:可以在 C++中使用 C 的已编译好的函数模块,在 c++中么用到 c 语言写的函数,声明一下,在 DLL 中经常看到,避免 C++ name mangling,主要用于动态链接库, 使得导出函数名称与 C 语言规则一致(不改变),方便不同的编译器甚至是不 同的开发语言调用。
    extern "C"是告诉C++编译器以C Linkage方式编译,也就是抑制C++的name mangling机制。

    编程:
    1.写出@proerty(nonatomic,retain)Person *person;@synthesize person 具体实现。

    - (void)setPerson:(Person *)person
    {
        if(_person != person){
            [_person release];
            [_person = person retain];
        } 
    }
    
    - (Person *)person
    {
        return _person;
    }
    

    2.从普通 id 类型对象转换成数字对象,因为配置了限定词.1f,所以结果四舍 五入,并保留一位小数

    NSDictionary* rowData = [NSDictionary dictionaryWithObjectsAndKeys:@"46.95",@"price",nil];
    NSLog(@"a double value:%.1f",[(NSNumber*)[rowData objectForKey:@"price"] doubleValue]);
    

    输出:
    a double value:47.0

    3.写一个委托的interface

    #import
    @protocol MyDelegate;//声明 
    @interface MyClass:NSObject 
    {
         id delegate;
    }
    @end
    @protocol MyDelegate//委托方法 
    -(void) selector:(NSString *) args; 
    @end
    

    4.请看下面一段代码

    static int a=1;
    int main(){
        int b=2;
        char* c=NUll;
        c=(char*)malloc(100*sizeof(char));
        return 0;
    }
    

    问:1.访问abc三者的效率从高到低依次是 :
    bca
    2.在最坏情况下排序速度最快的是:归并排序
    复杂度最高的是:快排 a,快排,冒泡,堆,归并

    5.看下面的程序

        NSMutableArray *arr = [[NSMutableArray array] retain];
        NSString *str = [NSString stringWithFormat:@"test"];
        [str retain];
        [arr addObject:str];
        NSLog(@"%@%lu",str,[str retainCount]);
        [str retain];
        [str release];
        [str release];
        NSLog(@"%@%lu",str,[str retainCount]);
        [arr removeObject:str];
        NSLog(@"%@%lu",str,[str retainCount]);
    

    请问:三次打印的retainCount分别是什么,为什么?
    答:分别是3,2,1,
    初始化的时候的为1,retain的时候+1,往数组里add的时候+1,release的时候 -1,从数组里移除的时候 -1。

    语言

    1. 请简述你对协议的理解
    2. 如何理解ARC自动引用计数机制
    3. 如何理解 retain/copy/assign/release/autor elease/dealloc关键字
    4. 请简述self.name = xxx 与_name= xxx 的区别
    5. 请简述类别和继承有什么联系和区别
    6. 请简述你对strong和weak关键字的理 解
    7. 请简述weak和assgin有什么区别
    8. 如何实现ARC和MRC的混合编程
    9. Objective-c中是否支持多继承
    10. Objective-c中变量默认是私有的 吗,方法默认是私有的吗
    11. #import"".h和@class+类名的区别
    12. 请简述页面传值都有哪些实现方式
    13. 请简述深拷贝和浅拷贝的区别

    设计模式

    1. 系统中有哪些对象是单例
    2. 请简述你对MVC设计模式的理解
    3. iOS中哪些技术符合观察者模式
    4. 请简述你对工厂方法的理解
    5. 什么是代理模式,实现代理需要注意什么

    UI

    1. 请简述StoryBoard和Xib的联系和区别
    2. 请简述UITableView对Cell的重用机 制
    3. 如何使用UIScrollView实现无限加载 多张图片
    4. 请简述视图控制器的生命周期
    5. UITableView有哪些优化方式
    6. 请简述iOS中的事件传递机制
    7. UITableView有哪些必须要实现的数 据源方法

    网络

    1. 请简述Http协议中get请求和post请求的区别
    2. 请简述你对异步请求数据的理解
    3. iOS中都有哪些技术可以实现开辟线 程,它们的联系和区别是什么
    4. NSThread中线程之间是如何实现通信 的
    5. CGD中有哪些创建线程的方式
    6. iOS中有哪些技术可以保证线程安全
    7. ASIHttpRequest的父类是什么
    8. 请简述AFNetWork的实现原理
    9. 你如何理解block,block有什么用途
    10. 请简述TCP和UDP的区别
    11. 请问怎样能够保证定位更省电
    12. 请简述SDWebImage的实现原理
    13. 请简述xml和json数据各有哪些优势
    14. 请简述线程和进程有什么联系和区别

    数据操作

    1. 请简述NSUserDefaults的使用场景和 使用注意事项
    2. iOS中数据库使用什么技术实现的
    3. 请简述什么是主键、什么是外键
    4. iOS中如何实现数据模型的存储
    5. 请简述iOS的沙盒机制

    项目

    1. 如何实现真机调试

    2. 如何查找项目中的内存泄露

    3. 项目中的支付环节如何实现的

    4. 如何实现项目上线到AppStore

    5. 请简述你在项目中遇到过哪些问题,如何解决的

    6. 如何实现流媒体格式的视频边播放,边缓存

    7. 请简述你理解的内存管理

    8. 请简述你理解的面向对象思想

    9. 如何设计一个缓存类

    10. 谈谈你对蓝牙技术的了解

    11. IOS8.0都有哪些新特性

    12. 什么是懒加载?

    13. 在ARC下发生内存泄露怎么处理

    14. GCD(异步的Block)中self.的处理

    15. APNS 推送的实现过程

    16. 添加NSNotificationCenter 监 听,其后面的 object 的意义是什么?

    17. 谈iOS的常用加密方式,以及各方 式的优劣

    18. 论Socket 和http协议的区别

    19. iOS中数据的持久化存储方式有哪 些

    20. 什么是kvc/kvo 及它们之间有什么 关系

    21. iOS中frame和bounds的区别

    22. 服务器连接三次握手。

    23. GCD有哪三种队列和用法。

    24. CALayer的和UIView和绘图API 的关系。

    25. 介绍动画矩阵变换算法。

    面试题#

    1. When to use NSMutableArray and when to use NSArray?
      答:当数组在程序运行时需要不断变化的,使用NSMutableArray;当数组在初始化后不再改动的,使用NSArray。
      需要指出的是,使用NSArray只表明的是该数组在运行时不发生改变,即不能往NSAarry的数组里添加或删除元素,但不表明其数组內元素的内容不能发生改变。NSArray是线程安全的,NSMutableArray不是线程安全的,多线程使用到NSMutableArray需要注意。

    2. Give us example of what are delegate methods and what are data source methods of uitableview.
      答:CocoaTouch框架中用到了大量委托,其中UITableViewDelegate就是委托机制的典型应用,是一个典型的使用委托来实现适配器模式,其中UITableViewDelegate协议是目标,tableview是适配器,实现UITableViewDelegate协议,并将自身设置为talbeview的delegate的对象,是被适配器,一般情况下该对象是UITableViewController。
      UITableVIew的Data Source方法有- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section;
      - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;

    3. How many autorelease you can create in your application? Is there any limit?
      在应用中可以创建多少autorelease对象,是否有限制?
      答案:

    4. If we don’t create any autorelease pool in our application then is there any autorelease pool already provided to us?
      如果我们不创建内存池,是否有内存池提供给我们?
      答案:界面线程维护着自己的内存池,用户自己创建的数据线程,则需要创建该线程的内存池

    5. When you will create an autorelease pool in your application?
      什么时候需要在程序中创建内存池?
      答案:用户自己创建的数据线程,则需要创建该线程的内存池

    6. When retain count increase?
      什么时候内存计数会增加?
      答案:见iOS面试题(一)

    7. What are commonly used NSObject class methods?
      类NSObject的那些方法经常被使用?
      答案:NSObject是Objetive-C的基类,其由NSObject类及一系列协议构成。
      其中类方法alloc、class、 description 对象方法init、dealloc、– performSelector:withObject:afterDelay:等经常被使用

    8. What is convenience constructor?
      什么是简便构造方法?
      答案:简便构造方法一般由CocoaTouch框架提供,如NSNumber的 + numberWithBool: + numberWithChar: + numberWithDouble: + numberWithFloat: + numberWithInt:
      Foundation下大部分类均有简便构造方法,我们可以通过简便构造方法,获得系统给我们创建好的对象,并且不需要手动释放。

    9. How to design universal application in Xcode?
      如何使用Xcode设计通用应用?
      答案:使用MVC模式设计应用,其中Model层完成脱离界面,即在Model层,其是可运行在任何设备上,在controller层,根据iPhone与iPad(独有UISplitViewController)的不同特点选择不同的viewController对象。在View层,可根据现实要求来设计,其中以xib文件设计时,其设置其为universal。

    10. What is keyword atomic in Objective C?
      在Objetive-C什么是原子关键字
      答案:atomic,nonatomic见iOS面试题(一)

    11. What are UIView animations?
      UIView的动画效果有那些?
      答案:有很多,如 UIViewAnimationOptionCurveEaseInOut UIViewAnimationOptionCurveEaseIn UIViewAnimationOptionCurveEaseOut UIViewAnimationOptionTransitionFlipFromLeft UIViewAnimationOptionTransitionFlipFromRight UIViewAnimationOptionTransitionCurlUpUIViewAnimationOptionTransitionCurlDown

    12. How can you store data in iPhone applications?
      在iPhone应用中如何保存数据?
      答案:有以下几种保存机制:
      1.通过web服务,保存在服务器上
      2.通过NSCoder固化机制,将对象保存在文件中
      3.通过SQlite或CoreData保存在文件数据库中

    13. What is coredata?
      什么是coredata?
      答案:coredata框架是apple提供的一套通用自动的解决方案,包括了对象生存周期、对象关系图、持久化机制。
      补充答案:上面是翻译的,按我个人理解coredata提供一种机制,让我们可以方便的把内存中对象、及对象间的关系映射到coredata,然后由它为我们持久化数据。相比普通的文件数据库SQlite,它的功能更强大,不需要我们先将对象数据format成SQL语句,存入数据库,再用select语句读出,而现在是从内存到coredata的数据管理,我们只需管理coredata的managed对象。是苹果提供一套数据保存

    14. What is NSManagedObject model?
      什么是NSManagedObject模型?
      答案:NSManagedObject是NSObject的子类 ,也是coredata的重要组成部分,它是一个通用的类,实现了core data 模型层所需的基本功能,用户可通过子类化NSManagedObject,建立自己的数据模型。

    15. What is NSManagedobjectContext?
      什么是NSManagedobjectContext?
      答案:NSManagedobjectContext对象负责应用和数据库之间的交互。

    16. What is predicate?
      什么是谓词?
      答案:谓词是通过NSPredicate,是通过给定的逻辑条件作为约束条件,完成对数据的筛选。

      predicate = [NSPredicate predicateWithFormat:@"customerID == %d",n];
      a = [customers filteredArrayUsingPredicate:predicate];
      
    17. What kind of persistence store we can use with coredata?
      coredata有哪几种持久化存储机制?
      答案:coredatat提供以下几种存储机制:XML(iOS系统不支持),自动存储,SQLite,内存存储。
      补充说明:这个问题问的是,coredate框架的存储机制,平时使用coredata时,更多关注的是managed的对象,这里是coerdata框架的存储实现细节。BTW: 其他常用的持久化存储方法 :存入到文件、 存入到NSUserDefaults(系统plist文件中)。

    18. 谈谈对Block的理解? 并写出一个使用Block执行UIView动画?
      答:Block是可以获取其他函数局部变量的匿名函数,其不但方便开发,并且可以大幅度提高应用的执行效率(多核心CPU可直接处理Block指令)

    [UIView transitionWithView:self.view duration:0.2 options:UIViewAnimationOptionTransitionFlipFromLeft animation:^{
        [[blueViewController view] removeFromSuperview];
        [[self view] insertSubview:yellowViewController.view atIndex:0];
    } completion:NULL];
    
    1. 写出上面代码的Block的定义
      答:
    typedef void (^animations)(void);
    typedef void (^completion)(BOOL finished);
    
    1. 试着使用+ beginAnimations:context:以及上述Block的定义,写出一个可以完成+ (void)transitionWithView:(UIView *)view duration:(NSTimeInterval)duration options:(UIViewAnimationOptions)options animations:(void (^)(void))animations completion:(void (^)(BOOL finished))completion NS_AVAILABLE_IOS(4_0);操作的函数执行部分
      答案:无

    2. 做过的项目是否涉及网络访问功能,使用什么对象完成网络功能?
      答案:ASIHTTPRequest与NSURLConnection

    3. 简单介绍下NSURLConnection类及+ sendSynchronousRequest:returningResponse:error:– initWithRequest:delegate:两个方法的区别?
      答案:NSURLConnection主要用于网络访问,其中+ sendSynchronousRequest:returningResponse:error:是同步访问数据,即当前线程会阻塞,并等待request的返回的response,而– initWithRequest:delegate:使用的是异步加载,当其完成网络访问后,会通过delegate回到主线程,并其委托的对象。

    4. Difference between shallow copy and deep copy?
      浅复制和深复制的区别?
      答案:浅复制:只复制指向对象的指针,而不复制引用对象本身。
      深复制:复制引用对象本身。
      意思就是有个对象A,复制一份得到A_copy对象后,对于浅复制来说,A和A_copy指向的是同一个内存资源,复制的只不过是一个指针,对象本身资源
      还是只有一份,那如果我们对A_copy执行了修改操作,那么发现A引用的对象同样被修改,这其实违背了我们复制拷贝的一个思想。深复制就好理解了,内存中存在了两份独立对象本身。
      用网上一哥们通俗的话将就是:
      浅复制好比你和你的影子,你完蛋,你的影子也完蛋
      深复制好比你和你的克隆人,你完蛋,你的克隆人还活着。

    5. What is advantage of categories? What is difference between implementing a category and inheritance?
      类别的作用?继承和类别在实现中有何区别?
      答案:category 可以在不获悉,不改变原来代码的情况下往里面添加新的方法,只能添加,不能删除修改。并且如果类别和原来类中的方法产生名称冲突,则类别将覆盖原来的方法,因为类别具有更高的优先级。
      类别主要有3个作用:
      (1)将类的实现分散到多个不同文件或多个不同框架中。
      (2)创建对私有方法的前向引用。
      (3)向对象添加非正式协议。
      继承可以增加,扩展父类方法,并且可以增加属性。

    6. Difference between categories and extensions?
      类别和类扩展的区别?
      答案:category和extensions的不同在于后者可以添加属性。另外后者添加的方法是必须要实现的。
      extensions可以认为是一个私有的Category。

    7. Difference between protocol in objective c and interfaces in java?
      oc中的协议和java中的接口概念有何不同?
      答案:OC中的协议有2层含义,官方定义为 formal和informal protocol。前者和Java接口一样。
      informal protocol中的方法属于设计模式考虑范畴,不是必须实现的,但是如果有实现,就会改变类的属性。
      其实关于正式协议,类别和非正式协议我很早前学习的时候大致看过,也写在了学习教程里
      “非正式协议概念其实就是类别的另一种表达方式“这里有一些你可能希望实现的方法,你可以使用他们更好的完成工作”。
      这个意思是,这些是可选的。比如我门要一个更好的方法,我们就会申明一个这样的类别去实现。然后你在后期可以直接使用这些更好的方法。
      这么看,总觉得类别这玩意儿有点像协议的可选协议。"
      现在来看,其实protocal已经开始对两者都统一和规范起来操作,因为资料中说“非正式协议使用interface修饰“,
      现在我们看到协议中两个修饰词:“必须实现(@requied)”和“可选实现(@optional)”。
      OC中的协议(formal protocol)与java中的接口概念基本一致,OC中非正式协议(informal protocol)就是类别。在java中如果继承了接口,但不实现其方法,会得到一个error(无法编译);在OC中的正式协议,如果不实现,会得到一个warning(可编译执行),如果想去除waring,还可以加关键字(@optional),让它可选实现方法。

    8. What are KVO and KVC?
      答案:kvc:键 - 值编码是一种间接访问对象的属性使用字符串来标识属性,而不是通过调用存取方法,直接或通过实例变量访问的机制。
      很多情况下可以简化程序代码。apple文档其实给了一个很好的例子。
      kvo:键值观察机制,他提供了观察某一属性变化的方法,极大的简化了代码。
      具体用到过的一个地方是对于按钮点击变化状态的的监控。
      比如我自定义的一个button

      [self addObserver:self forKeyPath:@"highlighted" options:0 context:nil];
      
      #pragma mark KVO
      - (void)observeValueForKeyPath:(NSString *)keyPath  ofObject:(id)object change:(NSDictionary *)change   context:(void *)context 
      { 
        if ([keyPath isEqualToString:@"highlighted"] ) { 
             [self setNeedsDisplay]; 
        } 
      }
      

    对于系统是根据keypath去取的到相应的值发生改变,理论上来说是和kvc机制的道理是一样的。
    对于kvc机制如何通过key寻找到value:
    “当通过KVC调用对象时,比如:[self valueForKey:@”someKey”]时,程序会自动试图通过几种不同的方式解析这个调用。首先查找对象是否带有 someKey 这个方法,如果没找到,会继续查找对象是否带有someKey这个实例变量(iVar),如果还没有找到,程序会继续试图调用 -(id) valueForUndefinedKey:这个方法。如果这个方法还是没有被实现的话,程序会抛出一个NSUndefinedKeyException异常错误。
    (cocoachina.com注:Key-Value Coding查找方法的时候,不仅仅会查找someKey这个方法,还会查找getsomeKey这个方法,前面加一个get,或者_someKey以及_getsomeKey这几种形式。同时,查找实例变量的时候也会不仅仅查找someKey这个变量,也会查找_someKey这个变量是否存在。)
    设计valueForUndefinedKey:方法的主要目的是当你使用-(id)valueForKey方法从对象中请求值时,对象能够在错误发生前,有最后的机会响应这个请求。这样做有很多好处,下面的两个例子说明了这样做的好处。“
    来至cocoa,这个说法应该挺有道理。
    因为我们知道button却是存在一个highlighted实例变量.因此为何上面我们只是add一个相关的keypath就行了,
    可以按照kvc查找的逻辑理解,就说的过去了。

    1. What is purpose of delegates?
      代理的作用?
      答案:代理的目的是改变或传递控制链。允许一个类在某些特定时刻通知到其他类,而不需要获取到那些类的指针。可以减少框架复杂度。
      另外一点,代理可以理解为java中的回调监听机制的一种类似。

    2. What are mutable and immutable types in Objective C?
      oc中可修改和不可以修改类型。
      答案:可修改不可修改的集合类。这个我个人简单理解就是可动态添加修改和不可动态添加修改一样。
      比如NSArray和NSMutableArray。前者在初始化后的内存控件就是固定不可变的,后者可以添加等,可以动态申请新的内存空间。

    3. When we call objective c is runtime language what does it mean?
      我们说的oc是动态运行时语言是什么意思?
      答案:多态。 主要是将数据类型的确定由编译时,推迟到了运行时。
      这个问题其实浅涉及到两个概念,运行时和多态。
      简单来说,运行时机制使我们直到运行时才去决定一个对象的类别,以及调用该类别对象指定方法。
      多态:不同对象以自己的方式响应相同的消息的能力叫做多态。意思就是假设生物类(life)都用有一个相同的方法-eat;
      那人类属于生物,猪也属于生物,都继承了life后,实现各自的eat,但是调用是我们只需调用各自的eat方法。
      也就是不同的对象以自己的方式响应了相同的消息(响应了eat这个选择器)。
      因此也可以说,运行时机制是多态的基础?

    4. what is difference between NSNotification and protocol?
      通知和协议的不同之处?
      答案:协议有控制链(has-a)的关系,通知没有。
      首先我一开始也不太明白,什么叫控制链(专业术语了~)。但是简单分析下通知和代理的行为模式,我们大致可以有自己的理解
      简单来说,通知的话,它可以一对多,一条消息可以发送给多个消息接受者。
      代理按我们的理解,到不是直接说不能一对多,比如我们知道的明星经济代理人,很多时候一个经济人负责好几个明星的事务。
      只是对于不同明星间,代理的事物对象都是不一样的,一一对应,不可能说明天要处理A明星要一个发布会,代理人发出处理发布会的消息后,别称B的
      发布会了。但是通知就不一样,他只关心发出通知,而不关心多少接收到感兴趣要处理。
      因此控制链(has-a从英语单词大致可以看出,单一拥有和可控制的对应关系。

    5. What is push notification?
      什么是推送消息?
      答案:太简单,不作答~~~~~~~~~~
      这是cocoa上的答案。
      其实到不是说太简单,只是太泛泛的一个概念的东西。就好比说,什么是人。
      推送通知更是一种技术。
      简单点就是客户端获取资源的一种手段。
      普通情况下,都是客户端主动的pull。
      推送则是服务器端主动push。

    6. Polymorphism?
      关于多态性
      答案:多态,父类指针指向子类对象。
      这个题目其实可以出到一切面向对象语言中,
      因此关于多态,继承和封装基本最好都有个自我意识的理解,也并非一定要把书上资料上写的能背出来。
      最重要的是转化成自我理解。

    7. Singleton?
      对于单例的理解
      答案:11,12题目其实出的有点泛泛的感觉了,可能说是编程语言需要或是必备的基础。
      基本能用熟悉的语言写出一个单例,以及可以运用到的场景或是你编程中碰到过运用的此种模式的框架类等。
      进一步点,考虑下如何在多线程访问单例时的安全性。

    8. What is responder chain?
      说说响应链
      答案: 事件响应链。包括点击事件,画面刷新事件等。在视图栈内从上至下,或者从下之上传播。
      可以说点事件的分发,传递以及处理。具体可以去看下touch事件这块。因为问的太抽象化了
      严重怀疑题目出到越后面就越笼统。
      可以从责任链模式,来讲通过事件响应链处理,其拥有的扩展性

    9. Difference between frame and bounds?
      frame和bounds有什么不同?
      答案:frame指的是:该view在父view坐标系统中的位置和大小。(参照点是父亲的坐标系统)
      bounds指的是:该view在本身坐标系统中 的位置和大小。(参照点是本身坐标系统)

    10. Difference between method and selector?
      方法和选择器有何不同?
      答案:selector是一个方法的名字,method是一个组合体,包含了名字和实现.
      详情可以看apple文档。

    11. Is there any garbage collection mechanism in Objective C.?
      OC的垃圾回收机制?
      答案: OC2.0有Garbage collection,但是iOS平台不提供。
      一般我们了解的objective-c对于内存管理都是手动操作的,但是也有自动释放池。
      但是差了大部分资料,貌似不要和arc机制搞混就好了。
      求更多~~

    12. NSOperation queue?
      答案:存放NSOperation的集合类。
      操作和操作队列,基本可以看成java中的线程和线程池的概念。用于处理ios多线程开发的问题。
      网上部分资料提到一点是,虽然是queue,但是却并不是带有队列的概念,放入的操作并非是按照严格的先进现出。
      这边又有个疑点是,对于队列来说,先进先出的概念是Afunc添加进队列,Bfunc紧跟着也进入队列,Afunc先执行这个是必然的,
      但是Bfunc是等Afunc完全操作完以后,B才开始启动并且执行,因此队列的概念理论上有点违背了多线程处理这个概念。
      但是转念一想其实可以参考银行的取票和叫号系统。
      因此对于A比B先排队取票但是B率先执行完操作,我们亦然可以感性认为这还是一个队列。
      但是后来看到一票关于这操作队列话题的文章,其中有一句提到
      “因为两个操作提交的时间间隔很近,线程池中的线程,谁先启动是不定的。”
      瞬间觉得这个queue名字有点忽悠人了,还不如pool~
      综合一点,我们知道他可以比较大的用处在于可以帮助多线程编程就好了。
      楼上区分了线程执行时的次序(Afunc和Bfunc谁先启动)和线程执行完成(Afunc和Bfunc谁先执行完)时的次序不同,而多线程的重要概念是并发(同时执行多个任务),NSOperationQueue是管理并发线程的对象,可以在其中放入NSOpertation对象(对象化的线程实体),通过设置maxConcurrentOperationCount的大小,控制并发数目,如楼上所说希望“Afunc添加进队列,执行完后,Bfunc紧跟进入队列,继续执行”,那只需将maxConcurrentOperationCount设为1,变会依次执行,这时候实际是在单线程依次执行。所以这里的NSOperationQueue就是对象化抽象的去管理多线程,这样的好处,使用者通过继承NSOperation对象,可以方便的用对象来管理线程,而不再用关心线程同步、信号量等细节,更多地关注于业务逻辑。

    13. What is lazy loading?
      答案:懒汉模式,只在用到的时候才去初始化。
      也可以理解成延时加载。
      我觉得最好也最简单的一个列子就是tableView中图片的加载显示了。
      一个延时载,避免内存过高,一个异步加载,避免线程堵塞。

    14. Can we use two tableview controllers on one viewcontroller?
      是否在一个视图控制器中嵌入两个tableview控制器?
      答案:一个视图控制只提供了一个View视图,理论上一个tableViewController也不能放吧,
      只能说可以嵌入一个tableview视图。当然,题目本身也有歧义,如果不是我们定性思维认为的UIViewController,
      而是宏观的表示视图控制者,那我们倒是可以把其看成一个视图控制者,它可以控制多个视图控制器,比如TabbarController
      那样的感觉。

    15. Can we use one tableview with two different datasources? How you will achieve this?
      一个tableView是否可以关联两个不同的数据源?你会怎么处理?
      答案:首先我们从代码来看,数据源如何关联上的,其实是在数据源关联的代理方法里实现的。
      因此我们并不关心如何去关联他,他怎么关联上,方法只是让我返回根据自己的需要去设置如相关的数据源。
      因此,我觉得可以设置多个数据源啊,但是有个问题是,你这是想干嘛呢?想让列表如何显示,不同的数据源分区块显示?

    相关文章

      网友评论

      • 爱阿爸的阿龙龙:有些数据好像又点问题呀 比如char的值域为 -128~127 竟然写成-127~128
      • 公考在路上:后面的那么多问题都是面试时会问到的,多谢整理。

      本文标题:iOS面试题,持续更新...

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