iOS程序员面试题系列(1)

来源:互联网 发布:淘宝网重复铺货 编辑:程序博客网 时间:2024/06/05 09:22

1.main(){

       int a[5]={1,2,3,4,5};

       int*ptr=(int*)(&a+1);

       printf(%d,%d”,*(a+1),*(ptr-1));

}

输出结果:2,5。

解释:&a是数组指针,其类型为int(*)[5];而指针加1要根据指针类型加上一定的值,不同类型的指针+1之后增加的大小不同,a是长度为5的int数组指针,所以要加5*sizeof(int),所以ptr实际是a[5],但是ptr与(&a+1)类型是不一样的,这点非常重要,所以ptr-1只会减去sizeof(int*),a,&a的地址是一样的,但意思就不一样了,a是数组首地址,也就是a[0]的地址,&a是对象(数组)首地址,a+1是数组下一元素的地址,即a[1],&a+1是下一个对象的地址,即a[5]。

2.写一个NSString类的实现

+(id)initWithCString:(constchar*)nullTerminatedCString encoding:(NSStringEncoding)encoding;

+(id)stringWithCString:(constchar*)nullTerminatedCString encoding:(NSStringEncoding)encoding{

       NSString *obj;

       obj = [self allocWithZone:NSDefaultMallocZone()];

       obj = [objinitWithCString:nullTerminatedCString encoding:encoding];

       return AUTORELEASE(obj);

}

3.OC有多重继承吗?不是的话有什么替代方法?

答:cocoa中所有的类都是NSObject的子类,多继承在这里是用protocol委托代理来实现的。

4.OC有私有方法吗,私有变量呢?

答:OC类里面的方法只有两种,静态方法和实例方法。所有实例变量默认都是私有的,所有实例方法默认都是公有的。

5.const意味着“只读”,下面的声明都是什么意思?

const int a;         声明了一个只读的整型变量a;

Int consta;          声明了一个只读的整型变量a;

const int*a;         声明了a是一个指向常整型数的指针,整型数是不可以修改的,指针是可以的。

int *const a;        声明了一个指向整型数的常指针,指针是不可修改的,指针指向的整型数是可以的。

int const*aconst; 声明了一个指向常整型数的常指针,整型数是不可修改的,指针也是不可修改的。

Const的作用:

(1):欲阻止一个变量被改变,可以使用const关键字。

(2):对指针来说,可以指定指针本身为const,也可以指定指针所指的数据为const,或者二者同时指定为const。

(3):在一个函数声明中,const可以修饰形参,表明它是一个输入参数,在函数内部不能改变其值。

(4):对于类的成员函数,若指定其为const类型,则表明其是一个常函数,不能修改类的成员变量。

6. static作用

答:(1)函数体类static变量的作用范围为该函数体,不同于auto变量,该变量的内存只被分配一次,因此其值在下次调用时扔维持上次的值。

(2)在模块内的static全局变量可以被模块内所有函数访问,但不能被模块外其他函数访问。

(3)在模块内的static函数只可被这一模块内的其他函数调用,这个函数的使用范围被限制在声明它的模块内。

(4)在类中的static成员变量属于整个类所拥有,对类的所有对象只有一份拷贝。

(5)在类中的static成员函数属于整个类所拥有,这个函数不接收this指针,因而只能访问类的static成员变量。

7.extern “C”的作用

(1)   被extern “C”限定的函数或变量是extern类型的;

(2)   被extern “C”修饰的变量和函数是按照C语言方式编译和连接的。

8.#import跟#include的区别,@class呢?

答:@class一般用于头文件中需要声明该类的某个实例变量的时候用到,在m文件中还是需要使用#import;而#import比起#include的好处就是不会引起交叉编译。

9.OC的优缺点:

优点:

(1):Categories

(2):Posing

(3):动态识别

(4):指标计算

(5):弹性讯息传递

(6):不是一个过度复杂的C衍生语言

(7):OC与C++可混合编程

缺点:

(1)   不支持命名空间;

(2)   不支持运算符重载;

(3)   不支持多重继承;

(4)   使用动态运行时类型,所有的方法都是函数调用,所以很多编译时优化方法都用不到。

10.OC的内存管理

答:通过分配和初始化(比如[[MyClassalloc]init])的方式来创建对象,那就拥有这个对象,需要负责该对象的释放。这个规则在使用NSObject的便利方法new时也同样适用。

如果拷贝(copy)一个对象,你也拥有拷贝得到的对象,需要负责该对象的释放;

如果保持(retain)一个对象,你就部分拥有这个对象,需要在不再使用时释放该对象。反过来,如果你从其他对象那里接到一个对象,则你不拥有该对象,也不应该释放它。

11.自动释放池是什么,如何工作?

答:当你向一个对象发送一个autorelease消息时,Cocoa就会将该对象的一个引用放入到最新的自动释放池。它仍然是个正当的对象,因此制动释放池定义的作用域内的其他对象可以向它发送消息。当程序执行到作用域结束的位置时,自动释放池就会被释放,池中的所有对象也就被释放。

12.堆和栈的区别:

答:(1)管理方式:对于栈来讲,是由编译器自动管理,无需我们手动控制;对于堆类说,释放工作由程序员控制,容易产生内存泄露。

(2)申请大小:栈:在windows下,栈是向低地址扩展的数据结构,是一块连续的内存区域,能从栈获得的空间较小。堆:堆是向高地址扩展的数据结构,是不连续的内存区域。堆获得的空间比较灵活,也比较大。

(3)   碎片问题:对于堆来讲,频繁的new/delete势必会造成内存空间的不连续,从而造成大量的碎片,使程序效率降低。对于栈来说,因为栈是先进后出的队列,以至于永远都不可能有一个内存块从栈中间弹出。

(4)   分配方式:堆都是动态分配的;栈有2种分配方式:静态分配和动态分配。

(5)   分配效率:栈是机器系统提供的数据结构,计算机会在底层对栈提供支持。堆则是C/C++函数库提供的,它的机制是很复杂的。

13.Swift新特性

答:(1)支持所有C和OC的基本类型;

(2)Swift提供了两种功能强劲的集合类型—Array和Dictionary;

(3)Swift还支持一种新的高级类型—元组;

(4)可选类型;

(5)支持闭包的特性;

(6)支持脚本语言的特性,但能高效地编译运行;

(7)类型安全的语言。

0 0
原创粉丝点击