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)类型安全的语言。
- iOS程序员面试题系列(1)
- iOS程序员面试题系列(2)
- iOS程序员面试题系列(3)
- iOS程序员面试题系列(4)
- iOS面试题系列:
- 面试题系列(1)
- ios面试题(1)
- iOS面试题(1)
- ios面试题(1)
- ios 面试题(1)
- ios 面试题(1)
- IOS面试题(1)
- ios面试题(1)
- IOS-4-面试题1:黑马程序员IOS面试题大全
- IOS面试题1
- IOS面试题--1
- IOS面试题1
- iOS 面试题(1)
- 争与不争
- opensessioninview
- 观点 | 为什么说云主机比物理机故障率更低?
- 数据结构堆的实现
- axis1发布方式
- iOS程序员面试题系列(1)
- Codeforces Round #290 (Div. 2) - C. Fox And Names (拓扑排序)
- AlertDialog
- ECSHOP调用分类文章
- Android 系统上实现APK插件机制——360手机助手
- Javascipt高级程序设计--笔记
- 【JS/文档】js 中的 Arguments 对象
- NodeJS优缺点及适用场景讨论
- Socket服务端与客户端一些小问题