周四去面试了XX公司iOS程序员,费了半天劲才找到地方,居然在一个破宾馆里面,一间小房子,3对办公桌拼起来的办公室,
一看到此情此景,我心顿时都凉了半截。房子里面热得要命,我坐那才一会,后背都湿了。
管事的拿了份面试题给我做,我做的时候感觉挺简单,不过后来查资料,好像有些地方还是不太对。题目如下:
1:Object-c有多重继承吗?没有的话有什么替代?
我的回答:没有。用protocol代替
网上答案:cocoa中的所有类都是NSObject的子类。多继承在这里是用protocol委托代理来实现的
2:static作用?
我的答案:静态声明。声明一个变量或方法为静态。静态变量在类的第一次实例化时,即分配存储空间。静态方法不需要类的实例即可访问。
网上答案:
(1)函数体内static变量的作用范围为该函数体,不同于auto变量,该变量的内存只被分配一次,因此此值在下次调用时扔维持上次的值。
(2)在模块内的static全局变量可以被模块内所用的函数访问,但不能被模块外其他函数访问
(3)在模块内的static函数只可被这一模块内的其他函数调用,这个函数的使用范围被限制在声明它的模块内
(4)在类中的static成员变量属于整个类所拥有,对类的所有对象只有一份拷贝
(5)在类中的static成员函数属于整个类所拥有,这个函数不接收this指针,因而只能访问类的static成员变量
3:#import和#include的区别。@class代表什么?
我的答案:区别在于#include可以避免循环引用的问题。@class代表的是其标识的是一个类,它在.m文件中#import。
网上答案:@class一般用于头文件中需要声明该类的某个实例变量的时候用到,在m文件中还是需要#import。
而#import比#include的好处就是不会引起交叉编译
4:Object-c的内存管理是如何管理的?
我的答案:
引用计数:当使用alloc创建新实例或赋值retain、copy(或ARC中的strong)标识的变量时,实例或变量的引用计数即加一,当它们的引用计数为0时,则由GC回收
网上答案:如果你通过分配和初始化,(比如[[MyClass alloc] init])的方式类创建对象,你就拥有这个对象,需要负责该对象的释放。这个规则在使用NSObject的便利方法new时也同样适用。如果你拷贝一个对象,你也拥有拷贝得到的对象,需要负责该对象的释放。如果你保持一个对象,你就部分拥有这个对象,需要在不再需要时释放
5:view中的frame和bounds有什么不同?
我的答案:view的frame代表的是父类中的view的位置。view的bounds代表的是view自己的坐标及长宽
网上答案:
frame指的是:该view在父view坐标系统中的位置和大小。(参照点是父亲的坐标系统)
bounds指的是:该view在本身坐标系统中 的位置和大小。(参照点是本身坐标系统)
6:如何在ios4.1以上使用ios3的代码(这个问题不太明白具体什么意思,按我的理解回答了)?
我的答案:在ARC项目中使用非ARC的代码,需要在编译设置里设置:-fno-objc-arc
7:请写一个委托代理的例子
.h文件
@protocol delegate; @required - (void)dosomething; @end @interface DelegateSimple<delegate> @end
.m文件
#import "DelegateSimple.h" @implementation DelegateSimple - (void)dosomething { NSLog(@"%@","This is implementation of the protocol"); } @end
8:请用block写出一个Singleton实例
+(Class *)sharedInstance { static Class *__singleton; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ __singleton = [[Class alloc] init]; }); return __singleton; }
9:请写出你常用的多线程调用的方法
-(void)downloadStringFromURL { NSURL *url = [NSURL URLWithString:[NSString stringWithFormart:@"%@", "www.xxxx.com"]]; ASIHTTPRequest * request = [ASIHTTPRequest requestWithURL:url]; [request setDelegate:self]; [request startAsynchronous]; } #pragma mark - ASIHTTPRequest异步请求回调方法 - (void)requestFinished:(ASIHTTPRequest *)request { NSString *responseString = [request responseString]; NSLog(@"%@", responseString); } - (void)requestFailed { NSError *error = [request error]; NSLog(@"%@", error); }
做完之后,办公室里又没有能做主的人,然后打电话给某某在正南京出差的汪总,跟他又聊了半天,看他好像聊得挺来劲,因为他在地铁里,信号不好,中途还断过一次电话。最后他问我薪资,我觉得这办公环境太差了点,就故意说高了点,他沉默了一会,让我回去等消息。