摘录一些iOS面试题

1.截取字符串”20|http://zcw-java.iteye.com“ 中 ‘|’字符前面及后面的数据,分别输出它们 
NSRange range = [str rangeOfString:@"|"];//获取范围 
int location = range.location;//获取位置 
NSString *str1 = [str subStringToIndex:location];//截取到第几位 
NSString *str2 = [str subStringFromIndex:location+1];//从第几位开始截取 

如果字符串是|20|3020|20|||40|这样的,那么就需要另一种方式了 
首先按照|符号进行分割 
NSArray *array = [str componentsSeparatedByString:@"|"]; 

遍历后判断非空 


2. 线程进程区别:如何实现同步功能?

1 进程是具有一定功能的程序关于某一数据集合的一次运行程序;线程是cpu进行资源分配和调度的基本单位。线程是比进程更小的能独立运行的基本单位,基本不具有系统资源,只有一点必不可少的资源,但是可与同一个进程中的线程共享资源。

2 一个线程可以创建和撤销另一个线程,一个进程可以同时并发多个线程。

3 一个程序至少有一个进程,一个进程至少有一个线程。

4 在执行过程中,每个线程都有一个执行的入口、执行序列以及执行出口。但是线程不能都独立运行,必须执行于应用程序中,由应用程序提供多个程序的执行控制。

5 从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。这就是进程和线程的重要区别。

同步方式:event, Critical Section(临界区域),Mutex(互斥器),信号量


3. 如何用http post数据到服务器?

MSMutableURLRequest *request = [[[MSMutableURLRequest alloc]init]autorelease];

[request setURL:[NSURL URLWithSring:urlString]];

[request setHTTPMethod:@"POST"];

[request setValue:@"application/x-www-form-urlencoded"  forHTTPHeaderField:@"Content-Type"];

[request setHTTPBody:postData];


4.获取项目根路径,并在其下创建一个名称为userData的目录。 
// 获取根路径 
NSArray *paths =NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES); 
NSString *documentsDirectory = [paths objectAtIndex:]; 
// 创建文件系统管理器 
NSFileManager *fileManager = [[NSFileManager alloc] init]; 
// 判断userData目录是否存在 
if(![fileManager fileExistsAtPath:[NSString stringWithFormat:@"%@/userData", documentsDirectory]]) { 
// 不存在,创建一个userData目录 
[fileManager createDirectoryAtPath:[NSString stringWithFormat:@"%@/userData", documentsDirectory]

            withIntermediateDirectories:false

                                        attributes:nil

                                               error:nil]; 

如果你在mac上测试一定是在你得文稿下边,但装到手机上就不一样了,每一个iPhone应用都会有一个自己独立得documents,所以不会冲突!


5.写一个发送同步http请求,并获得返回结果的方法 



6.怎样启动一个新线程,子线程怎样刷新主UI 

启动:

NSThread* myThread = [[NSThread alloc] initWithTarget:self
                                                                             selector:@selector(myThreadMainMethod:)
                                                                                object:nil];

[myObj performSelectorInBackground:@selector(myThreadMainMethod)

                                           withObject:nil];

子线程刷新主UI

[self performSelectorOnMainThread:@selector(buttonGo2)

                                         withObject:nil

                                    waitUntilDone:YES];


7.什么是Notification?

答:观察者模式,controller向defaultNotificationCenter添加自己的notification,其他类注册这个notification就可以收到通知,这些类可以在收到通知时做自己的操作(多观察者默认随机顺序发通知给观察者们,而且每个观察者都要等当前的某个观察者的操作做完才能轮到他来操作,可以用NotificationQueue的方式安排观察者的反应顺序,也可以在添加观察者中设定反映时间,取消观察需要在viewDidUnload 跟dealloc中都要注销)。参考链接:http://useyourloaf.com/blog/2010/6/6/delegation-or-notification.html   


8.什么时候用delegate,什么时候用Notification?

答:delegate针对one-to-one关系,并且receiver可以返回值给sender,notification 可以针对one-to-one/many/none,receiver无法返回值给sender.所以,delegate用于sender希望接受到receiver的某个功能反馈值,notification用于通知多个object某个事件。   


9.什么是KVC和KVO?

答:KVC(Key-Value-Coding)内部的实现:一个对象在调用setValue的时候,(1)首先根据方法名找到运行方法的时候所需要的环境参数。(2)他会从自己isa指针结合环境参数,找到具体的方法实现的接口。(3)再直接查找得来的具体的方法实现。KVO(Key-Value-Observing):当观察者为一个对象的属性进行了注册,被观察对象的isa指针被修改的时候,isa指针就会指向一个中间类,而不是真实的类。所以isa指针其实不需要指向实例对象真实的类。所以我们的程序最好不要依赖于isa指针。在调用类的方法的时候,最好要明确对象实例的类名。  


10. 写一个NSString类的实现

+ (id)initWithCString:(const char *)nullTerminatedCString

                 encoding:(NSStringEncoding)encoding;

+ (id) stringWithCString: (const char*)nullTerminatedCString
                      encoding: (NSStringEncoding)encoding
{

        NSString  *obj;

        obj = [self allocWithZone: NSDefaultMallocZone()];
        obj = [obj initWithCString: nullTerminatedCString encoding: encoding];
        return AUTORELEASE(obj);
}


11.为什么标准头文件都有类似以下的结构? 
   #ifndef __INCvxWorksh  
   #define __INCvxWorksh  
   #ifdef __cplusplus  
   extern "C" {  
   #endif  
    
   #ifdef __cplusplus  
   }  
   #endif  
   #endif

显然,头文件中的编译宏“#ifndef __INCvxWorksh、#define __INCvxWorksh、#endif” 的作用
是防止该头文件被重复引用。


12. 用变量a给出下面的定义
a) 一个整型数(An integer)  
b)一个指向整型数的指针( A pointer to an integer)  
c)一个指向指针的的指针,它指向的指针是指向一个整型数( A pointer to a pointer to an intege)r  
d)一个有10个整型数的数组( An array of 10 integers)  
e) 一个有10个指针的数组,该指针是指向一个整型数的。(An array of 10 pointers to integers)  
f) 一个指向有10个整型数数组的指针( A pointer to an array of 10 integers)  
g) 一个指向函数的指针,该函数有一个整型参数并返回一个整型数(A pointer to a function that takes an integer as an argument
 and returns an integer)  
h) 一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数( An array of ten pointers to functions t
hat take an integer argument and return an integer )  
 
答案是:  
a) int a; // An integer  
b) int *a; // A pointer to an integer  
c) int **a; // A pointer to a pointer to an integer  
d) int a[10]; // An array of 10 integers  
e) int *a[10]; // An array of 10 pointers to integers  
f) int (*a)[10]; // A pointer to an array of 10 integers  
g) int (*a)(int); // A pointer to a function a that  takes an integer argument and returns an integer  
h) int (*a[10])(int); // An array of 10 pointers to functions  that take an integer argument and return an integer


13.http和scoket通信的区别。
http是客户端用http协议进行请求,发送请求时候需要封装http请求头,并绑定请求的数据,服务器一般有web服务器配合(当然也非绝 对)。 http请求方式为客户端主动发起请求,服务器才能给响应,一次请求完毕后则断开连接,以节省资源。服务器不能主动给客户端响应(除非采取http长连接 技术)。iphone主要使用类是NSUrlConnection。

scoket是客户端跟服务器直接使用socket“套接字”进行连接,并没有规定连接后断开,所以客户端和服务器可以保持连接通道,双方 都可以主动发送数据。一般在游戏开发或股票开发这种要求即时性很强并且保持发送数据量比较大的场合使用。主要使用类是CFSocketRef。

TCP全称是Transmission Control Protocol,中文名为传输控制协议,它可以提供可靠的、面向连接的网络数据传递服务。传输控制协议主要包含下列任务和功能:
* 确保IP数据报的成功传递。
* 对程序发送的大块数据进行分段和重组。
* 确保正确排序及按顺序传递分段的数据。
* 通过计算校验和,进行传输数据的完整性检查。


14.用预处理指令#define声明一个常数,用以表明1年中有多少秒(忽略闰年问题)
#define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL  
我在这想看到几件事情:
#define 语法的基本知识(例如:不能以分号结束,括号的使用,等等)  
懂得预处理器将为你计算常数表达式的值,因此,直接写出你是如何计算一年中有多少秒而不是计算出实际的值,是更清晰而没有代价的。
意识到这个表达式将使一个16位机的整型数溢出-因此要用到长整型符号L,告诉编译器这个常数是的长整型数。  
 如果你在你的表达式中用到UL(表示无符号长整型),那么你有了一个好的起点。记住,第一印象很重要。


写一个"标准"宏MIN ,这个宏输入两个参数并返回较小的一个。
#define MIN(A,B) ((A) <= (B) ? (A) : (B))  


这个测试是为下面的目的而设的:  
1. 标识#define在宏中应用的基本知识。这是很重要的,因为直到嵌入(inline)操作符变为标准C的一部分,宏是方便产生嵌入代码的唯一方法,对于嵌入式系统来说,为了能达到要求的性能,嵌入代码经常是必须的方法。  
2. 三重条件操作符的知识。这个操作符存在C语言中的原因是它使得编译器能产生比 if-then-else 更优化的代码,了解这个用法是很重要的。
3. 懂得在宏中小心地把参数用括号括起来  
我也用这个问题开始讨论宏的副作用,例如:当你写下面的代码时会发生什么事?  
least = MIN(*p++, b); 
结果是:((*p++) <= (b) ? (*p++) : (*p++))
这个表达式会产生副作用,指针p会作三次++自增操作。




// 先发布待修改。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值