iOS 面试题

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

上面代码输出结果是:2,5

sizeof:是一个运算符,类型结果为size_t,在头文件中typedef为unsigned int,值通常在编译时计算好,参数类型可以是数组、指针、类型、对象,函数等。注意对齐问题,要以最长类型计算,得出占用字节的大小。

strlen:是一个函数,只能用char*做参数,且必须是以结尾,在运行时才能得出结果,返回的是字符的实际长度。

strcpy:函数只用于字符串的拷贝,源字符与目标字符在拷贝时长度不满足拷贝都会导致地址混乱,两字符串重叠则结果混乱,遇到结束符则终止拷贝。

strncpy:同strcpy,且可自定义拷贝长度,但结果不包含,需自己加结束符。

sprintf:函数操作的对象不限于字符串,源对象可以是任意基本类型的数据,主要实现将其他数据类型转换为字符串,遇到结束符停止拷贝。

memcpy:实现将一块内存拷贝到另一块内存,没有类型限制,可指定长度,但同样要注意越界,重叠等问题。

C和C++中的struct有什么不同?和C++的class呢?

C的struct没有权限设置,没有成员函数,没有构造函数,虚构函数等等,是用户自定义的数据类型(UDT)

C++的struct是抽象数据类型(ADT),支持成员函数的定义,几乎与class一致,区别是struct的成员默认是public,class中默认是private的;在用模版的时候只能写template <class Type>或template <typename Type>不能写template <struct Type>;

此外,如果没有多态和虚拟继承,在C++中,struct和class的存取效率完全相同!简单的说就是,存取class的data member和非virtual function效率和struct完全相同!不管该data member是定义在基类还是派生类的。 如果不是为了和C兼容,C++中就不会有struct关键字。

因此建议是:如果不需要与C兼容或传递参数给C程序,不要在C++中用struct。

不用变量实现两个数字交换的代码如下:

a = a ^ b;
b = a ^ b;
a = a ^ b;

IBOutlet的属性设置为weak是为什么呢?

IBOutlet连接的属性,相当于创建了一个对象,添加到当前VC的View中,view对添加到它上面的控件是强引用的,我们在VC中仅是对其使用,并没有必要拥有它,所以是weak的。将weak改成strong也没问题,当VC释放,则该控件引用计数器会自动减1,紧接着VC的View释放,该控件引用计数器继续减1,并不会造成循环引用。

ARC中属性关键字

atomic,nonatomic,readwrite,readonly,strong,weak,assign,copy,retain,unsafe_unretained,geter=<name>,setter=<name>

默认属性有readwrite,atomic,strong(对象),assgin(基本数据类型)

@synthesize指令高数编译器在编译期间产生getter和setter方法

@dynamic指令告诉编译器在编译期间不自动生成getter和setter方法,主要用于NSManageObject对象的属性声明中

weak的生命周期:具体实现方法

 __weak与__block的区别

__block可修饰对象和基本数据类型,被修饰对象可在block中重新赋值,适用于ARC和MRC

__weak只能修饰对象,可避免循环引用,适用于ARC

http://www.cocoachina.com/ios/20160817/17373.html
http://www.cocoachina.com/ios/20160819/17398.html
https://github.com/ChenYilong/iOSInterviewQuestions

原文地址:https://www.cnblogs.com/nmzd/p/5723406.html