image

编辑人: 人逝花落空

calendar2025-06-19

message9

visits742

滴滴出行软件开发工程师 面试经历(2014年4月)

面试题:

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:

我的回答 声明一个LinkedList类,成员:Node *head, Node *tail, bool reversed;

其中head是头指针,tail是尾指针,reversed是标识链表是否被逆序(YES为逆序,NO为顺序)

回 答:

@interface Node{

Node *next;

Node *previous;

id data;

}

@end

@interface LinkedList{

Node *head;

Node *tail;

bool reversed;

}

-(bool) reverse;

@end

满意的地方:

挺好的

不满意的地方:

喵呜刷题:让学习像火箭一样快速,快来微信扫码,体验免费刷题服务,开启你的学习加速器!

创作类型:
原创

本文链接:滴滴出行软件开发工程师 面试经历(2014年4月)

版权声明:本站点所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明文章出处。
分享文章
share