码迷,mamicode.com
首页 > 移动开发 > 详细

IOS基础面试题

时间:2015-08-01 23:19:56      阅读:218      评论:0      收藏:0      [点我收藏+]

标签:

     最近离职了,找工作,光会做项目,对基础不熟,今天就总结了一点面试题。

     废话不多说,上题吧:

1.objective-c中的数字对象都有哪些,简述它们与基本数据类型的区别是什么。

基本类型和C一样,主要是有int、long、double、float、char、void、bool。对于基本数据类型,不需要使用指针,
NSNumber是OC的数字对象,需要考虑内存释放问题。
数字类型有:NSInteger、CGFloat。数据对象有NSNumber。对象和变量的差别。可以拆装效果。
其他的类型有NSString和NSMutableString,NSString是不可变字符串,变量和基本类型一样不需要手动释放。他的
retainCount是-1。retainCount:我们都知道,在IOS中,使用引用计数来实现内存的管理,当一个对象在任何地方都
没有被引用到的时候,会被自动释放。这个时候retanCount是0。而且提供了一个-(NSInteger)retainCount的方法来
实现获取对象的持有数。NSNumber* number = [NSNumber numberWithInt:1];NSLog(@"%lu",[number retainCount]);
NSArray是一个不可变的数组,一般用于保存固定的数据。NSMutableArray是一个可变数组。可以直接进行操作。
NSSet是一个不可变集合,NSMutableSet是一个可变集合。集合是一组单值的操作。
NSDictionary是一个键值对的数据集合。NSMutableDictionary是一组可变的数据键值对。都需要考虑内存释放问题。
dictionary是按照key来排序的。
2.用NSLog函数输出一个浮点类型,结果四舍五入,并保留一位小数。
CGFLoat number = 3.1415926;
NSLog("@0.1f",number);
3.截取字符串”20|http://www.621life.com“ 中 ‘|’字符前面及后面的数据,分别输出它们。
NSString* normalString = @"20|http://www.621life.com";
NSArray* array = [normalString componentSeparatedByString:@"|"];
NSLog(@"%@和%@",array[0],array[1]);
4.objective-c中的词典对象、可变词典对象是哪个,初始化一个含有两个键值对的可变词典对象,并动态的添加和
删除一条记录,输出第一条记录。
NSDictionary和NSMutableDictionary。
NSMutableDictionary* dictionary = [NSMutableDictionary dictionaryWithObjectsAndKeys:@"val1",@"key1",@"val2",@"key2"];
NSEnumerator* enumerator = [dictionary keyEnumerator];
id key = [enumerator nextObject];
while(key)
{
id object = [dictionary objectForKey:key];
NSLog(@"值:%@,key:%@",,key);
key = [enumerator nextObject];
}
//增加元素:
[dictionary setObject:@"val3" forKey:@"key3"];
//删除元素:
[dictionary removeObjectForKey:@"key1"];
注意的地方:调用了nectObject之后要重新复制,不然指针指向最末尾处。
5.获取项目根路径,并在其下创建一个名称为userData的目录。
NSString* rootPath = NSHomeDirectory();
NSString* path = [rootPath stringByAppendingString:@"路径"];
NSFileManager* filemanager = [NSFileMamager defaultManager];
if(![filemanger fileExistsAtPath:path])
{
//创建
[filemanager createDirectoryAtPath:path];
}
6.在一个对象的方法里面:self.name = "object";和name ="object"有什么不同吗?
self.name="object",这个会让引用计数增加,隐士调用了set方法,如果你自己重写了set
方法,一定不要这么用,这样子语法会死循环。会使retainCount增加。name="object",直接赋值,
引用计数不变。
7.定义属性时,什么情况使用copy,assign,和retain。
assign是数据类型时候调用,retain和copy用户对象,copy主要是当a指向一个对象,b也想同样指向他的时候出现。
如果用assign,a如果释放,在调用b,会软件崩溃。如果copy的话,a和b有自己的内存,a释放的时候,b不会崩溃。
如果用retain的话,会是计数增加,也可以调用。另外,atomic和nonatomic是用来决定编译器生成的setting和getting
是否是原子操作。在多线程的情况下,原子操作是必须的。否则可能会引起错误信息。
8.ViewController 的viewDidLoad,viewDidUnload,dealloc,viewWillAppear,viewWillDisappear。
(1)viewDidLoad只有view在nib文件加载的时候才会调用。
(2)viewDidUnLoad是在系统内存吃紧的时候才会调用,在该方法中,会将所有的IBOutlet设置成nil,在该方法中释放
其他的和view有关的对象,其他在运行时创建但是不是系统的对象,在viewDidLoad中创建的对象,缓存数据等release
对象后,将对象设置成nil。
(3)dealloc:这个方法是
流程:loadView/nil来加载view到内存中,viewDidLoad函数进一步初始化这些view,内存不足的时候,调用viewDidUnLoad
来释放内存数据,当使用的时候,又回到第一步。
(4)viewWillAppear这个方法是在视图即将调用的时候出现。一般这个时候用代理比较多一点。
(5)viewWillDisappear这个是在即将消失的时候调用。
9.写一个发送同步http请求,并获得返回结果的方法。
同步方法:
NSMutableURLRequest* request = [[NSMutableRequest alloc] init];
[request setURL:[URL RULWithString:@"http://www.baidu.com"]];
[request setHTTPMethod:@"GET"];
NSData* data = [NSURLConnection sendSynchronousRequest:request returnResponse:nil error:nil];
10.怎样启动一个新线程,子线程怎样刷新主UI。
判断一个线程是不是主线程。
if([NSThread isMainThread])
IOS中,只有主线程才能立即刷新UI,一般我们放在主线程中,
dispatch_sync(dispatch_get_main_queue(),^{
//实现信息
});
11.简述objective-c内存管理的实现机制,并简述什么时候由你负责释放对象,什么时候不由你释放。
OC里面使用retainCount来管理对象,当发送retain的时候,引用计数会自动增加一个,当retainCount为0的时候
,系统自动条用release,会自动释放,当一个对象使用如下操作的时候,他就有了使用权限:alloc、allocWithZone、
copy、copyWithZone、mutableCopy、mutableCopyWithZone。如果没有创建对象或者复制,而是保留引用,同样拥有权限
retain。在IOS4.0之后,会自动使用ARC来使用内存的管理机制,编译器会自动的使用retain、release、autorelease来
实现项目的内存管理信息。
12.类的定义及声明文件以什么为后缀名?
在IOS里面,类的声明是在.h文件,实现是在.m文件。
13.怎样自动生成属性的获取方法和设置方法?
在IOS里面,在现在的话,可以不自动写set和get方法,在.h文件里面定义变量,在.m文件中直接添加_变量就可以了。
还可以使用@synthesize使用。
14.声明一个静态方法和一个实例方法。
+符号表示,表示类的方法,-表示,表示实例方法。静态方法长住内存,但是实例方法不是,所以静态方法效率高但是站
内存,实例方法相反,加载速度和实际和内存几乎无差。静态方法在堆中分配内存,实例方法在堆栈中分配内存。
实例方法要先创建对象才能使用,但是静态方法是类的方法,可以直接被类使用。用的比较平凡才使用静态方法,
静态方法修改的是类的状态,但是实例方法修改的是各个对象的信息。类的实例方法是在类消失的时候,对象没有,
实例也没有,但是静态方法,只要你还引用这个空间,就一直会存在这个方法。
15.什么是MVC,你工作时怎样运用它。
MVC,视图、模型、控制器。view视图,数据json对象模型,controller控制器,view和模型一直不通讯。
view和controller之间最经典的形式是IBOutlet,也有用纯代码实现的情况。
16.#define SQUAKE(a)((a)*(a))
int a=5;
int b;
b = SQUAKE(a++);
此时:b=__30___
答案 30
解析: #define SQUAKE(a)((5)*(6))
17.进程间通信的方式有
1.管道:用于具有某种亲缘关系进行进程间的通讯,允许一个进程和另一个和他有共同祖先的进程通讯。
2.命名管道:命名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘
关系进程间的通信。命名管道在文件系统中有对应的文件名。命名管道通过命令mkfifo或系统调用mkfifo来创建。
3.信号Signal:信号是比较复杂的通信方式,用于通知接受进程有某种事件发生,除了用于进程间通信外,进程
还可以发送信号给进程本身;linux除了支持Unix早期信号语义函数sigal外,还支持语义符合Posix.1标准的信号
函数sigaction(实际上,该函数是基于BSD的,BSD为了实现可靠信号机制,又能够统一对外接口,用sigaction
函数重新实现了signal函数)。
4.消息Message队列:消息队列是消息的链接表,包括Posix消息队列system V消息队列。有足够权限的进程可以
向队列中添加消息,被赋予读权限的进程则可以读走队列中的消息。消息队列克服了信号承载信息量少,管道只能
承载无格式字节流以及缓冲区大小受限等缺。
5.共享内存:使得多个进程可以访问同一块内存空间,是最快的可用IPC形式。是针对其他通信机制运行效率较低
而设计的。往往与其它通信机制,如信号量结合使用,来达到进程间的同步及互斥。
6.内存映射(mapped memory):内存映射允许任何多个进程间通信,每一个使用该机制的进程通过把一个共享的
文件映射到自己的进程地址空间来实现它。
7.信号量(semaphore):主要作为进程间以及同一进程不同线程之间的同步手段。
8.套接口(Socket):更为一般的进程间通信机制,可用于不同机器之间的进程间通信。起初是由Unix系统的BSD分
支开发出来的,但现在一般可以移植到其它类Unix系统上:Linux和System V的变种都支持套接字。
18.将一个头指针为head且带头结点的单链表反向排列,求算法。
#include
using namespace std;
typedef struct _NODE{
int x;
struct _NODE *pNext;
}NODE;

#define LEN_NODE ( sizeof(NODE) )

NODE *pHead = (NODE *) malloc (LEN_NODE);

void fun( NODE *p )
{
NODE *pCur, //curten node of old list
*pNewCur; //curten node of new list
pCur = pHead->pNext;
pHead->pNext = NULL;
while( pCur )
{
if( pHead->pNext != NULL )
{//link other node
pNewCur = pHead->pNext;
pHead->pNext = pCur;
pCur = pCur->pNext;
pHead->pNext->pNext = pNewCur;
}
else
{//Link first node
pHead->pNext = pCur;
pCur = pCur->pNext;
pHead->pNext->pNext = NULL;
}
}
//test print
pCur = pHead->pNext;
while( pCur )
{
printf("%d\n", pCur->x );
pCur = pCur->pNext;
}
}

void main()
{
NODE *pCur = pHead;
int i = 10;
while( i-- )
{
pCur->pNext = (NODE *) malloc (LEN_NODE);
pCur = pCur->pNext;
pCur->x = i + 1;
}
pCur->pNext = NULL;
pCur = pHead->pNext;
while( pCur )
{
printf("%d\n", pCur->x );
pCur = pCur->pNext;
}
//TEST
fun(pHead);
}
19.C语言中讲讲static变量和static函数有什么作用。
static有两种意思:1表示变量是静态存储变量,表示变量存放在静态存储区。2表示该变量是内部连接,只在本文件
内部有效,别的文件不能应用该函数,不加static的函数默认是全局的。
static全局变量与普通的全局变量有什么区别:static全局变量只初使化一次,防止在其他文件单元中被引用;
static局部变量和普通局部变量有什么区别:static局部变量只被初始化一次,下一次依据上一次结果值;
static函数与普通函数有什么区别:static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝。
20.什么时候用delegate,什么时候用Notifiction?
delegate用于一对一,notifiction可以用于一对多、一对一、一对无。可以通知多个对象。
21.用预处理#define声明一个一个常量的时候。
#SECONDS_YEAR (60 * 60 * 365 * 24) UL
22.写一个委托信号。
@protocol MyDelegate
- (void)didJobs:(NSArray *)args;
@end

@protocol MyDelegate;

@interface MyClass: NSObject
{
id delegate;
}

这个是我写的一个代理:
@protocol ProductDelegate<NSObject>
-(void)doSomeThing:(NSInteger)index;
@end

@interface ProductViewController:ViewController
@property(nonatomic,weak) id<ProductDelegate> prodelegate;
@end

//调用这个协议的类 实现接口
//实现类
[self doSomeThing:1];
23.写一个NSString类的实现。


24.OC有多重继承吗?如果没有,有代替方法吗?
OC里面要实现多重继承,一般用代理。
25.obj-c有私有方法么?私有变量呢?
有,类的变量和实例变量。
26.关键字const有什么含意?修饰类呢?static的作用,用于类呢?还有extern c的作用。
const表示只读的意思。
const int a;
int const a;
const int *a;
int * const a;
int const * a const;
分别表示的意思是:前两个的意思一样,表示a是一个常量整型,第三个表示这个是一个这项长整型数的指针。
第四个表示指向整数的常指针,第五个表示a表示指向一个常整型数的常指针。
27.为什么标准头文件都有类似以下的结构?
#ifndef __INCvxWorksh
#define __INCvxWorksh
防止被重用呗。
28.#import跟#include的区别,@class呢?
@class表示声明,只是知道有这么个东西,至于里面有什么,不用完全知道。#import不会出现重复引用的现象。
#include表示引用,可能会出现重复引用。
29.线程与进程的区别和联系?
进程和线程都是由操作系统所提供的基本单元,系统利用该基本单元实现系统的并发操作。主要差别是在于不同的
操作系统资源管理方式,进程有独立的地址空间,但是线程没有,一个进程崩溃了,在保护模式下,线程会继续正常运行。
线程只是一个进程中不同的执行路径。线程有自己的堆栈和局部变量,但是线程没有独立的地址空间,所以一个
线程死亡的时候,进程也会死亡。多进程的程序比多线程的程序健壮的多。但是要求同时执行又要共享资源只能
用线程,不能用进程。
30.例举几个进程的同步机制,比较优缺点。
1.进程之间通讯的途径:
2.进程死锁的原因:环路、互斥、请求保持、不可剥夺
3.死锁的处理:避免策略、检测和解除死锁
31.堆和栈的区别。
堆:对象,静态变量名,类名,在项目加载的时候就加载。
栈:保存变量名。
32.什么是KV,key和value的操作。
在OC里面,最经典的操作是字典,一个key对应一个value,根据key来查找对象,键路径是由一个用点来做分隔符的键组成的
字符串,用于连接在一起的对象序列,第一个键的性质是由先前的性质决定,通过键路径,你可以指定对象图中的任意一个
深度的路径,指向相关对象的特定属性。
33.C和OC如何混用。
后缀名为.m文件可以识别OC文件,混用的方式是将.m文件改成.mm文件。但是cpp文件不能混用OC文件。
34.自动释放池是什么,如何工作。
当你在向一个对象发送autorelease的时候,cocoa就会将该对象的一个引用放到最新的自动释放池中,他任然是一个
正当的对象,因此自动释放池定义的作用域的其他对象可以向他发出消息。
当程序执行到作用域结束的位置的时候,自动释放池就会自动释放,里面所有的对象就会被释放。
每碰到copy,retain计数就会加1,每次碰到release、autorelease计数就会减1。
35.objc的优缺点?
优点:
动态识别;
指标计算;
弹性信息传递;
不是一个过度复杂的C衍生语言;
OC和C++ 可混编语言;
Posing;
Cateogies。
缺点:
不支持命名空间;
不支持运算符重载;
不支持多重继承;
性能低,因为很多优化方法用不到。
36.sprintf、strcpy、memcpy使用的时候有什么要注意的吗?
sprintf:
strcpy:
memcpy:
37.用变量定义a。
1)整形a int a;
2)一个指向整形数的指针 int *a;
3)一个指向指针的指针,指针指向整形数 int** a;
4)一个有10个整形数的数组 int[] a;
38.readwrite,readonly,assign,retain,copy,nonatomic 属性的作用。
property是一个属性访问声明,括号内支持如下属性:
1.getting和setting,设置setting和getting的方法名。
readwrite:可读写
readonly:只读
assign:数据,
retain:
copy:复制
nonatomic:
39.http和socket通信的区别?
http :是客户端用http协议进行请求,发送请求的时候需要封装http请求头,并绑定请求的数据,
http请求是客户端主动发出请求,服务端才给相应,一次请求完毕之后,会断开连接,节省资源。
服务端不能主动给客户端响应。除非采用http长连接,iphone主要是使用NSURLConnection技术。
socket:是客户端和服务器之间使用socket继续套件字继续连接,并没有规定连接后断开,所以
客户端和服务器之间保持连接通道,双方都可以主动发送数据。一般在游戏或者股票开发的时候
使用,主要是CFSocketRef。
40.TCP和UDP协议?
TCP:传输控制协议,他可以提供可靠的、面向对象的网络数据传递服务。传输控制协议主要包含下面
任务和功能:
1)确保IP数据包的成功传递。
2)对程序发送的大块数据继续封装和重组。
3)确保正确排序和顺序传递分段的数据。
4)通过计算校验和,进行传输数据的完整性检查。
TCP:面向连接的、可靠的数据流传输,数据安全、慢。
UDP:非面向连接的、不可靠的数据流传递、快。
41.其他的模式?
单例模式、代理模式、工厂模式。
42.什么是push?
push是客户端程序留下后门端口,客户端总是监听正对对这个后门的请求,于是服务器可以主动的向这个端口
推送消息。
43.静态链接库?
为.a文件,不同的工程里面导入文件就可以使用里面的类。
44.什么是沙箱模型?哪些操作是属于私有的api范畴?
沙箱模型:
在iphone沙箱模型里面,有四格文件夹:documents、tmp、app、Library。手动保存的文件保存在documents里面。
1.Documents:你应该将所有的应用数据文件写入到这个文件夹里面,这个文件夹主要是存储用于数据或者其他应该备份的东西。
2.app:这个是应用程序的程序包目录,包含应用程序的本身。由于应用程序必须经过签名,所有你在运行时候不能
对这个文件夹进行操作。否则程序没法正常运行。
3.Library:Cache和Preferences两个文件夹,Cache文件夹:用于存放应用程序专用的支持文件,保存应用程序
再次启动的时候需要的信息。
Preferences:包含应用程序的偏好设置文件,你不应该直接创建偏好设置文件,而是应该使用NSUserDefault来取得
和设置应用程序的偏好。
获取沙盒主目录:
NSString* homePath = NSHomeDirectory();
4.获取应用程序程序包中资源文件路径的方法:
NSString* imagePath = [[NSBundle mainBundle] pathForResource:@"apple" ofType:@"png"];
UIImage* iamge = [[UIImage alloc] initWithContentsOfFile:imagePath];
45.文件IO写入:
1.将数据写到Documents目录:
- (BOOL)writeApplicationData:(NSData *)data toFile:(NSString *)fileName {
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *docDir = [paths objectAtIndex:0];
if (!docDir) {
NSLog(@”Documents directory not found!”); return NO;
}
NSString *filePath = [docDir stringByAppendingPathComponent:fileName];
return [data writeToFile:filePath atomically:YES];
}

2.从Documents目录读取数据:
- (NSData *)applicationDataFromFile:(NSString *)fileName {
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *docDir = [paths objectAtIndex:0];
NSString *filePath = [docDir stringByAppendingPathComponent:fileName];
NSData *data = [[[NSData alloc] initWithContentsOfFile:filePath] autorelease];
return data;
}
NSSearchPathForDirectoriesInDomains这个主要就是返回一个绝对路径用来存放我们需要储存的文件。
- (NSString *)dataFilePath {
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
return [documentsDirectory stringByAppendingPathComponent:@"shoppingCar.plist"];
}
NSFileManager* fm=[NSFileManager defaultManager];
if(![fm fileExistsAtPath:[self dataFilePath]]){

//下面是对该文件进行制定路径的保存
[fm createDirectoryAtPath:[self dataFilePath] withIntermediateDirectories:YES attributes:nil error:nil];
//取得一个目录下得所有文件名
NSArray *files = [fm subpathsAtPath: [self dataFilePath] ];
//读取某个文件
NSData *data = [fm contentsAtPath:[self dataFilePath]];
//或者
NSData *data = [NSData dataWithContentOfPath:[self dataFilePath]];
}
46.用到哪些数据存储方式?
core data、sqllite、对象序列化、文件直接读写、NSUserDefault。
文件直接读写>core data>对象序列化>sqllite>NSUserDefault。
47.线程的常见方法有哪些?你怎么处理的多线程?多线程的问题你了解吗?
线程创建的几种方式,线程的加锁、休眠、唤醒、解锁、退出。
多线程要考虑同步的问题,解决的同步问题是对某一个资源进行加锁,当一个线程
操作本资源的时候,其他线程不能工作。
系统自带线程池的作用:
凡是需要启动多个线程的地方都可以使用NSOperationQueue,加入到NSOperationQueue中的对象都需要继承NSoperation。
NSOperationQueue会在系统内部启动一个独立的线程去执行这个被加入到对象的main方法。
常用的地方是用NSOperationQueue下载图片,文件。如果是自己创建的一个线程池,无非是启动多个线程的时候,吧这些线程
对象放入到一个大的数组中,如果需要启动多个线程的时候,先从数组中找空闲的线程来使用。自己管理线程池的
最大难题是不好处理当启动多个线程的时候,用户在多个界面的跳转的时候,对线程方法的回调处理。
48.init和initWithObject的区别?
init创建的对象不带自动释放功能。
49.你使用过json解析吗?他们底层是怎么样的?
底层原理是遍历字符串中间的字符,最终根据格式规定的特殊字符,比如:{},[],:。进行区分。{}号是一个字典的开始,
[]是一个数据的开始,:是键值的分水岭,最终是将json转化成字典。字典中可能是字典、数据、字符串而已。
50.你连接服务器是用什么方式?如果请求中,网络中断怎么办?
NSURLConnection连接后,有一方系统委托方法来处理服务器的数据,如果网络连接失败,会调用相对应的方法。
51.xml解析的原理是什么?
NSXMLParser,其他解析方式是有自定义的二进制解析,就是按照字节去解析,电话会谈就是这样纸,还可以用
字符串之间用特殊符号用特殊符号连接的数据,将数据用特殊符号可以分割成所用的数据。
52.类别有什么作用?
1. 可以使本来需要在.h中声明的方法放到.m文件中声明,达到了可以使方法不对外公开。
2. 可以方便的扩展类,甚至系统类都可以轻易扩展,维护了代码原本的结构不受影响。
3. 类别可以写到不同的.h或.m文件中,可以分散代码到跟类别的扩展功能想关联的地方,方便查看。
53.分线程回调主线程的方法是什么?
[[self performSelectorOnMainThread:@selector(buttonGo2) withObject:nil] waitUntilDone:YES];
[self performSelector:@selector(buttonGo2) onThread:[NSThread mainThread] withObject:nil waitUntilDone:YES];
54.你在开发大型项目的时候,如何进行内存泄露检测的?
XOCDE里面有一个工具,run-->start with performance tool里面有一个instruments下有一个leaks工具,启动这个
工具的时候,运行项目,工具里可以显示内存泄露的情况,双击就可以找到源码的位置,可以帮助进行内存泄露问题。
55.view和view之间怎么传值?
代理。
56.让一个物体从界面的一点运行到另一点,有哪些方法?
动画。
57.你了解的加密方式?
MD5、ASE
58.地图定位?
我没搞过。
59.打开URL。
[[UIApplcation shareApplication] openURL:[NSURL URLWithString:]];
60.http网络通讯。
ASIHTTPRequest是一个直接在CFNetwork上做的开源项目:直接提交(HTTP POST)文件的API,异步请求,自动管理上传和下载的队列
管理机,ASIFormDataRequest用于适合上传文件,图片数据。
61.图片浏览。
从相机中选取图片,UIImagePickerController。
62.对象序列化。
NSCoding encodeWithCoder initWithCoder
NSKeyedUnarchiver NSKeyedArchiver
63.各种picker
UIDataPicker和UIPickerView。
64.电影播放、音频播放。

65.线程?
线程的创建和使用规则。
NSThread
三种方式:
-(id)init;
-(id)initWithTarget:(id)target selector:(SEL)selector object:(id)argument;

线程锁:
NSCondition方法:
[thread lock]加锁 [thread singnal]线程启动 [thread unlock]解锁 [thread exit]线程解锁
sleep(n);
66.各种排序算法?

67.通信底层原理。
答:OSI七层模型
7 应用层: ftp,smtp,http,telnet,tftp(通过各种协议,最终还是包装成TCP数据包,发送到网络中!)
6 表现层:
5 会话层:
4 传输层: tcp udp
3 网络层: ip,ICMP,IGRP,EIGRP,OSPF,ARP
2 数据链路层: STP,VT
1 物理层:
68.为什么很多内置类如UITableViewController的delegate属性都是assign而不是retain的?
会引起循环引用
所有的引用计数系统,都存在循环应用的问题。例如下面的引用关系:
* 对象a创建并引用到了对象b.
* 对象b创建并引用到了对象c.
* 对象c创建并引用到了对象b.

这时候b和c的引用计数分别是2和1。
当a不再使用b,调用release释放对b的所有权,因为c还引用了b,所以b的引用计数为1,b不会被释放。
b不释放,c的引用计数就是1,c也不会被释放。从此,b和c永远留在内存中。
这种情况,必须打断循环引用,通过其他规则来维护引用关系。我们常见的delegate往往是assign方式的属性而不是retain方式 的属性,
赋值不会增加引用计数,就是为了防止delegation两端产生不必要的循环引用。
如果一个UITableViewController 对象a通过retain获取了UITableView对象b的所有权,这个UITableView对象b的delegate又是a,
如果这个delegate是retain方式的,那基本上就没有机会释放这两个对象了。自己在设计使用delegate模式时,也要注意这点。
69. 以下每行代码执行后,person对象的retain count分别是多少?
Person *person = [[Person alloc] init]; count 1
[person retain]; retain count 2
[person release];retain count 1
[person release];retain count = 0
71.main()
{
int a[5]={1,2,3,4,5};
int *ptr=(int *)(&a+1);
printf("%d,%d",*(a+1),*(ptr-1));
}

答:2,5

*(a+1)就是a[1],*(ptr-1)就是a[4],执行结果是2,5
  &a+1不是首地址+1,系统会认为加一个a数组的偏移,是偏移了一个数组的大小(本例是5个int)
  int *ptr=(int *)(&a+1);
  则ptr实际是&(a[5]),也就是a+5
原因如下:
  &a是数组指针,其类型为 int (*)[5];
  而指针加1要根据指针类型加上一定的值,不同类型的指针+1之后增加的大小不同。
  a是长度为5的int数组指针,所以要加 5*sizeof(int)
  所以ptr实际是a[5]
  但是prt与(&a+1)类型是不一样的(这点很重要)
  所以prt-1只会减去sizeof(int*)

  a,&a的地址是一样的,但意思不一样
a是数组首地址,也就是a[0]的地址,&a是对象(数组)首地址,
a+1是数组下一元素的地址,即a[1],&a+1是下一个对象的地址,即a[5]。
72.sprintf、strcpy、memcpy使用的时候有什么要注意的吗?
这些函数区别在于实现功能和操作对象上,strcpy函数操作的对象是字符串,完成源字符串到目标字符串的功能。
snprintf函数操作对象是不限于字符串,虽然目标对象是字符串,但是源对象可以是字符串、也可以是任意的基本
类型的数据。这个函数是用来实现(字符串或者是基本数据类型)向字符串的转化功能。如果元对象是字符串,并且
指定%s格式符,也可实现字符串拷贝。
memcpy是内存拷贝,实现将一个内存块的内容复制到另一个内存块中。
strcpy 无疑是最合适的选择:效率高且调用方便。
snprintf 要额外指定格式符并且进行格式转化,麻烦且效率不高。
memcpy 虽然高效,但是需要额外提供拷贝的内存长度这一参数,易错且使用不便;并且如果长度指定过大的话
(最优长度是源字符串长度 + 1),还会带来性能的下降。其实 strcpy 函数一般是在内部调用 memcpy 函数或者
用汇编直接实现的,以达到高效的目的。因此,使用 memcpy 和 strcpy 拷贝字符串在性能上应该没有什么大的差别。
对于非字符串类型的数据复制来说,strcpy和sprintf一般就无能为力了,但是memcpy就可以。memcpy 的长处是用来
实现(通常是内部实现居多)对结构或者数组的拷贝,其目的是或者高效,或者使用方便,甚或两者兼有。
void *memcpy(void *dest, const void *src, size_t n);
从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中。
原型声明:char *strcpy(char* dest, const char *src);
说明:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。
返回指向dest的指针。
int sprintf( char *buffer, const char *format, [ argument] … );

73.写一个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);
}  

对面试有需要的,仅工参考,我自己写的,如果有不对的地方,欢迎指出。

 

IOS基础面试题

标签:

原文地址:http://www.cnblogs.com/jiaoxiangjie/p/4694808.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!