前面笔试题难到以后就简单了!面试题:
1.怎样实现一个singleton(单例模式),请给出思路
要实现一个Singleton Class, 至少需要做以下四个步骤:
1. 为Singleton Object实现一个静态实例, 初始化, 然后设置成nil.
2. 实现一个实例构造方法(通常命名为 sharedInstance 或者 sharedManager)检查上面声名的静态实例是否为nil, 如果是则新建并返回一个本类实例.
3. 重写 allocWithZone: 方法来保证当其他人直接使用 alloc 和 init 试图获得一个新实例的时候不会产生一个新的实例.
4. 适当的实现 copyWithZone:, release, retain, retainCount 和 autorelease.
@interface MySingleton : NSObject {
// ...
}
+ (MySingleton *)sharedInstance;
// Interface
- (NSString *)helloWorld;
@end
#import "MySingleton.h"
static MySingleton *sharedInstance = nil;
@implementation MySingleton
#pragma mark Singleton methods
+ (MySingleton *)sharedInstance {
@synchronized(self) {
if (sharedInstance == nil) {
sharedInstance = [[MySingleton alloc] init];
}
}
return sharedInstance;
}
+ (id)allocWithZone:(NSZone *)zone {
@synchronized(self) {
if (sharedInstance == nil) {
sharedInstance = [super allocWithZone:zone];
return sharedInstance; // assignment and return on first allocation
}
}
return nil; // on subsequent allocation attempts return nil
}
- (id)copyWithZone:(NSZone *)zone {
return self;
}
- (id)retain {
return self;
}
- (unsigned)retainCount {
return UINT_MAX; // denotes an object that cannot be released
}
- (void)release {
//do nothing
}
- (id)autorelease {
return self;
}
#pragma mark -
#pragma mark NSObject methods
- (id)init {
if (self = [super init]) {
// ...
}
return self;
}
- (void)dealloc {
// ...
[super dealloc];
}
#pragma mark -
#pragma mark Implementation
- (NSString *)helloWorld {
return @"Hello World!";
}
@end
2.请简述错误消息处理机制
Object-C语言的异常处理符号和C++、JAVA相似。再加上使用NSException,NSError或者自定义的类,你可以在你的应用程序里添加强大的错误处理机制。
异常处理机制是由这个四个关键字支持的:@try,@catch,@thorw,@finally。当代码有可能出现异常时,我们把他放到@try语句块中。@catch()块包含了处理@try块里的抛出的异常的逻辑。无论异常是否发生,@finally块里面的语句都会执行。如果直接使用@throw块来抛出异常,这个异常本质上是一个OC的对象。咱们可以使用NSException对象,但是不局限于他们。
3.定义一个指针函数实现数组排序
Objective-C函数指针
2011-08-02 10:29:01
C/C++:
typedef void (*CMDFUN)(SocketEngine * socket);
Objective-C:
IMP OnEnterHall = [self methodForSelector:@selector(OnEnterHall:)];//----This is the Point
[eventLogin AddCmd:hchUserLogin fun:(CMDFUN)OnEnterHall];
[eventLogin AddCmd:hhcUserGetInfo fun:(CMDFUN)OnEnterHall];
- (void)OnEnterHall:(SocketEngine *)socket{
[AppDelegate sharedDelegate] performSelector:@selector(ServerConnected:) withObject:loadingView afterDelay:1.0f];
}
4.实现一个单链表的逆转
1. 声明一个Node类,成员:Node *next, Node *previous, id data;
2. 声明一个LinkedList类,成员:Node *head, Node *tail, bool reversed;
其中head是头指针,tail是尾指针,reversed是标识链表是否被逆序(YES为逆序,NO为顺序)
当reversed是YES的时候就从head开始遍历,NO就从tail开始遍历。
实现就自己写吧
@interface Node{
Node *next;
Node *previous;
id data;
}
@end
@interface LinkedList{
Node *head;
Node *tail;
bool reversed;
}
-(bool) reverse;
@end
...1:非ARC下使用block时,内存管理注意什么
注意循环引用
2。详细描述UITableViewCell的重用机制以及重用的作用
1-重取出来的cell是有可能已经捆绑过数据或者加过子视图的,所以,如果有必要,要清除数据(比如textlabel的text)和remove 掉add过 的子视图(使用tag)。
2-这样设计的目的是为了避免频繁的 alloc和delloc cell对象而已,没有多复杂。
3-设计的关键是实现cell和数据的完全分离
1轮面试:笔试
面试感受:一般;面试难度:困难;面试来源:网络招聘
共1个问题,1条回答
Q:我的回答 声明一个LinkedList类,成员:Node *head, Node *tail, bool reversed;
其中head是头指针,tail是尾指针,reversed是标识链表是否被逆序(YES为逆序,NO为顺序)