iOS 面试题整理

老牛浏览 334评论 0发表于

iOS 面试题整理

1.浅拷贝和深拷贝
浅拷贝只是拷贝对象本身
深拷贝会对子对象以及子对象的子对象进一步拷贝

2.C语言里的数组与OC数组的区别
OC数组是一个对象,有大量的方法,C没有都需要自己写
C数组删除是需要后面往前移动,OC数组自动处理了

3.类别的作用
类别是给已有的类添加方法,但是不能添加变量,匿名类别除外

4.类别和继承的区别
类别很方便的给现有类添加方法,但是不能添加成员变量,匿名类除外,
比如SDWebImage给UIImageView增加了setImageWithURL:方法。
继承可以给现有的类增加方法和成员变量。这里没有类别方便。

5.解释TCP/IP协议
    HTTP
    TCP UDP
    IP
TCP/IP是网络开发中常见的传输协议,和UDP相比是可靠的
http是基于TCP/IP的主要用户互联网的协议。
可靠是TCP传输会给对方一个ACK信号(确认信号)
TCP传输没有UDP快,吞吐量没有UDP大
TCP是顺序的,TCP会保持连接
在我们IOS开发中http较多,http协议是一个被动式的。

6.界面之间传值有哪几种方法
单例,代理,直接赋值,通知中心/广播,数据库等

7.什么是MVC模式
Model,View,Controller,是IOS开发中典型的设计模式
比如通过http把网络数据下载后解析然后存在数据模型Model中,然后通知Controller去刷新界面,
通过Contr将Model和View进行关联,这就是MVC。

8.常见的点击手势有哪几种
UIPinchGesture,UITapGesture,UISwipGesture,UILongPressGesture,UIRotationGesture

9.如何理解复用机制
一般是对UIScrollView做复用机制,因为UIScrollView滚动窗口没有复用,原理就是超过屏幕的view不能销毁,而放在
复用池里面存放起来,后面再scrollView显示view时,先去复用池里面找有没有可复用的view,如果没有就alloc,有就直接用。

10.解释多线程,NSThreadNSOperation,GCD
多线程在IOS用的很多,比如每个ASI请求,SDWebImage请求,数据请求等待网络数据处理,多线程/异步就是主要为了界面流畅,防止界面假死
每一个ASI请求就是一个NSOperation
每一个NSUrlConnection也是一个线程
NSTread是创建线程的一个通用的类。比如线程创建,取消,开始等。
NSOperation就是一个简单的以任务为导向的多线程模型。目的是为了不懂操作系统,不懂线程的人使用。
GCD类似于NSOperation,是一个blocks版本的线程模型。

NSThread,NSOperation,GCD是IOS中使用多线程的三种方式之一。他们各有优缺点。抽象层次是从低到高的,抽象度越高的使用越简单。
NSThread,缺点:需要自己维护线程的生命周期和线程的同步和互斥,但是这些都需要耗费系统的资源。优点:比其它两个更轻。
NSOperation,优点:不需要自己管理线程的生命周期和线程的同步和互斥等。只是需要关注自己的业务逻辑处理,需要和NSOperationQueue一起使用。
GCD,是Apple开发的一个多核编程解决方法,优点:比前面两者更高效更强大。

11.什么是异步
相对于同步来说,单独开一个或多个线程去处理。异步就是用线程来实现的。
比如界面下载数据,我们启动一个异步任务ASI去网络下载数据,然后异步刷新界面,无需等待网络数据下载完成。

12.代理和协议什么区别
代理是一种概念,协议是一种技术,代理是用协议来实现的,是2个对象之间通讯的一种方式。
代理主要做反向传值。实现系统的一些回调方法,比如scrollView滑动事件,ASI网络下载完成等。

13.如何调用iOS打电话,发短信
[UIApplication sharedApplication] openURL:[NSURL urlWithString:@"tel://1543434"]];
电话:tel  短信:sms  邮件:mail  浏览器:http 以及其他应用

14.What are KVO and KVC
kvc-key value coding kvc是路径访问的编码规范。
kvo-key value observer kvo是观察某个变量的变化过程。
类似于代理,通知,都是一种通讯方法。

15、cell的重用机制(iOS6之后,可以提前注册cell)
tableView中有对cell的重用队列,每个cell在初始化的时候都被设置一个可重用的标识符,
cell先会根据重用标识符到tableView的重用队列中取,取不到的话在初始化

16.请简述你对strongweak关键字的理解;
两者都是ARc中用于修饰对象的关键词。
strong是强引用,用法类似于retainweak是弱引用,用法类似于assign,但是和assign有一定区别。

17.请简述weakassign有什么区别:
从内存的角度来讲,两者没有任何区别,都不会持有指针,但是如果一旦对象被释放了,则assign指向一块未知空间而weak会自动指向nil18.如何实现ARC和MRC的混合编程:
在arc项目中将非arc的类加上-fno-objc-arc标注来实现混编。

19、如何优化UITableView 
局部刷新,异步下载,数据缓存,提前注册,提前计算数值

20.系统中有哪些对象是单例:
NSApplicationNSFontManagerNSDocumentControllerNSHelpManagerNSNullNSProcessInfoNSNotificationCenterNSUserDefaults21,手动写settergetter方法
- (void) setOldValue: (NSString*) newValue {
if(newValue !=oldValue) {
[oldValue release];
oldValue = [newValue?retain];
}
}

22、请简述你对工厂方法的理解:
工厂就是我们调用一个类方法告诉工厂我们需要的是什么样的对象,则方法就会返回给我们一个对应类型的对象,
至于是如何实例化创建的该对象我们都不需要去了解。

23、解析xml的方式
两种方法:
1).ios中已有的NSXMLParse类,NSXMLParser 实现的是sax方法解析xml文件。
2).Google的GDataXML也是基于libxml2的,因此在使用GDataXML之前,你需要先导入libxml2,此方法为dom解析方法。
dom实现的原理是把整个xml文档一次性读出,放在一个树型结构里。在需要的时候,查找特定节点,然后对节点进行读或写。他的主要优势是实现简单,读写平衡;缺点是比较占内存,因为他要把整个xml文档都读入内存,文件越大,这种缺点就越明显。

sax的实现方法和dom不同。他只在xml文档中查找特定条件的内容,并且只提取需要的内容。这样做占用内存小,灵活,正好满足我们的需求。他的缺点就是写,有些资料介绍了写入的方法,但是我感觉这对本例没有必要。
运行NSXMLParser涉及设置、运行和响应结果。

24.对于语句NSString *obj = [[NSData alloc]init],obj在编译时和运行时分别是什么类型的对象?
答:编译时为NSString类型,运行时为NSData类型。

25.object-c中创建线程的方法是什么?如果在主线程中执行代码,方法是什么?如果想延时执行代码,方法又是什么?
a、线程创建有三种方法:使用NSThread创建(detachNewThreadSelector:toTarget:withObject:)、使用GCD的dispatch、使用子类化的NSOperation,然后将其加入NSOperationQueue;
b、在主线程执行代码,方法是performSelectorOnMainThread,
c、如果想延时执行代码可以用performSelector:withObject:afterDelay:

26. XML有哪几种解析方式,他们各有什么优点
答:有Sax和Dom两种解析方式,sax是逐行解析。dom是一次性全部加载xml文件,然后解析

27.请简述iOS中的事件传递机制:
iOS事件路由机制。

28.CALayer的和UIView和绘图API的关系:
calayer是层,每一个uiview都会有一个层在里面,层负责修改uiview的形状阴影、颜色等操作。

29.FMDB本地存储和加载:
首先创建一个数据库操作类,通过数据库操作类,创建表。创建增、删、查、改方法。
当从网络上获取到数据后,首先把获取到得数据存入到数据库,当需要使用时,首先判断数据库中是否有数据,如果有,直接调用,如果没有,再次下载。

30.推送:用户把自己手机id发送给开发者,开发者把需要推送的消息,以及用户id发送给服务器,服务器按照用户id把推送消息发送给用户,
而客户端只需要有接受消息的代码即可,系统会自动识别消息并推送给用户。极光推送省去了开发者服务器。

31.代理的作用
答案:代理的目的是改变或传递控制链。允许一个类在某些特定时刻通知到其他类,而不需要获取到那些类的指针。可以减少框架复杂度。

32.我们说的oc是动态运行时语言是什么意思
答案:多态。 主要是将数据类型的确定由编译时,推迟到了运行时。这个问题其实浅涉及到两个概念,运行时和多态。
简单来说,运行时机制使我们直到运行时才去决定一个对象的类别,以及调用该类别对象指定方法。
多态:不同对象以自己的方式响应相同的消息的能力叫做多态。意思就是假设生物类(life)都用有一个相同的方法-eat;
那人类属于生物,猪也属于生物,都继承了life后,实现各自的eat,但是调用是我们只需调用各自的eat方法。
也就是不同的对象以自己的方式响应了相同的消息(响应了eat这个选择器)
因此也可以说,运行时机制是多态的基础?

33.通知和协议的不同之处
答案:协议有控制链(has-a)的关系,通知没有。
简单来说,通知的话,它可以一对多,一条消息可以发送给多个消息接受者。
代理按我们的理解,到不是直接说不能一对多,比如我们知道的明星经济代理人,很多时候一个经济人负责好几个明星的事务。
只是对于不同明星间,代理的事hbnh布会,代理人发出处理发布会的消息后,别称B的发布会了。
但是通知就不一样,他只关心发出通知,而不关心多少接收到感兴趣要处理。因此控制链(has-a从英语单词大致可以看出,单一拥有和可控制的对应关系。

34.什么是单例模式
单例就是在多个对象之间共享数据,类似于全局变量,比如数据库打开一次,多个界面都可以使用。
写一个单例
//1.将本类的对象设置静态的,这样就能保证对象的唯一性。
static SetUpManage *manage  = nil;

+(SetUpManage *)sharedManage{
    @synchronized(self){//2同步设置,保证线程安全
        //3.若果对象为空,那就创建一个对象
        if (manage == nil) {
            manage = [[SetUpManage alloc]init];
        }
    }
    return manage;
}

35.Difference between frame and bounds??frame和bounds有什么不同
答案:frame指的是:该view在父view坐标系统中的位置和大小。bounds指的是:该view在本身坐标系统中的位置和大小。

36.Difference between method and selector方法和选择器有何不同
答案:selector是一个方法的名字,method是一个组合体,包含了名字和实现.

37.代理和通知的区别
代理主要做反向传值,一般用在1:1的两个对象通讯上
通知是通过注册然后接收事件的一种多对多的方法.

38.NSOperation queue
答案:存放NSOperation的集合类。
操作和操作队列,用于处理ios多线程开发的问题。
网上部分资料提到一点是,虽然是queue,但是却并不是带有队列的概念,放入的操作并非是按照严格的先进现出。

39.What is lazy loading
答案:懒加载,只在用到的时候才去初始化。也可以理解成延时加载。
最简单的一个列子就是tableView中图片的加载显示了。一个延时加载,避免内存过高,一个异步加载,避免线程堵塞。

40.Object-c的类可以多重继承么?可以实现多个接口么?重写一个类的方式用继承好还是分类好?为什么?
Objective-c只支持单继承,如果要实现多继承的话,可以通过类别和协议的方式来实现,cocoa中所有的类都是NSObject的子类,多继承在这里是用protocol委托代理来实现的。

41.#import 跟#include 又什么区别 #import<> 跟 #import""又什么区别
答案:@class一般用于头文件中需要声明该类的某个实例变量的时候用到,在m文件中还是需要使用#import而#import比起#include的好处就是不会引起交叉编译。

42.post和get有什么区别
是http请求的两种方式
post是安全的,get是不安全的
get参数不能太长 <1K
get不能上传文件,post可以上传文件

43.本地存储方式有哪几种
数据库,NAUserDefaults,file,plist,archieve归档(对象)

44.怎么实现对象的本地存储
归档NSArchieve

45nil,NSNULL,NULL区别
nil是指向obj-c中对象的空指针,是一个对象,在o-c中ni对象调用方法不会引起crash。
Nil是指向obj-c中的类的空指针,表示的是一个空类。
NULL是指向任何类型的空指针(如c/c++中的空指针),在objective-c中是一个数值。
NSNULL用于集合操作,在集合对象中,表示一个空值的集合对象。

46. 线程与进程的区别和联系
进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。
线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,
但在进程切换时,耗费资源较大,效率要差一些。但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。

47.在iphone上有两件事情要做,请问是在一个线程里按顺序做效率高还是两个线程里做效率高?为什么?

48.ios平台怎么做数据的持久化?coredata和sqlite有无必然联系?coredata是一个关系型数据库吗?
iOS中可以有四种持久化数据的方式: 属性列表、对象归档、SQLite3和Core Data;core data可以使你以图形界面的方式快速的定义app的数据模型,同时在你的代码中容易获取到它。
core data提供了基础结构去处理常用的功能,例如保存,恢复,撤销和重做,允许你在app中继续创建新的任务。
在使用core data的时候,你不用安装额外的数据库系统,因为core data使用内置的sqlite数据库。core data将你app的模型层放入到一组定义在内存中的数据对象。
core data会追踪这些对象的改变,同时可以根据需要做相反的改变,例如用户执行撤销命令。
当core data在对你app数据的改变进行保存的时候,core data会把这些数据归档,并永久性保存。
mac os x中sqlite库,它是一个轻量级功能强大的关系数据引擎,也很容易嵌入到应用程序。可以在多个平台使用,sqlite是一个轻量级的嵌入式sql数据库编程。
与core data框架不同的是,sqlite是使用程序式的,sql的主要的API来直接操作数据表。
Core Data不是一个关系型数据库,也不是关系型数据库管理系统(RDBMS)。虽然Core Dta支持SQLite作为一种存储类型,但它不能使用任意的SQLite数据库。
Core Data在使用的过程种自己创建这个数据库。Core Data支持对一、对多的关系。

49.UIscrollVew用到了什么设计模式?还能再foundation库中找到类似的吗?
模板(Template)模式,所有datasource和delegate接口都是模板模式的典型应用,
组合模式composition,所有的containerview都用了这个模式
观察者模式observer,所有的UIResponder都用了这个模式。

50. main()
{
int a[5]={1,2,3,4,5};
int *ptr=(int *)(&a+1);
printf("%d,%d",*(a+1),*(ptr-1));
}
答:2,5

51.readwritereadonlyassignretaincopynonatomic 属性的作用?
@property是 一个属性访问声明,扩号内支持以下几个属性:
1getter=getterName,setter=setterName,设置settergetter的方法名
2readwrite,readonly,设置可供访问级别
2assignsetter方法直接赋值,不进行任何retain操作,为了解决原类型与环循引用问题
3retainsetter方法对参数进行release旧值再retain新值,所有实现都是这个顺序(CC上有相关资料)
4copysetter方法进行Copy操作,与retain处理流程一样,先旧值release,再Copy出新的对象,retainCount为1。这是为了减少对上下文的依赖而引入的机制。
5nonatomic,非原子性访问,不加同步,多线程并发访问会提高性能。注意,如果不加此属性,则默认是两个访问方法都为原子型事务访问。锁被加到所属对象实例级(我是这么理解的…)。

52.OC里怎么实现多继承
OC没有多继承。用协议实现多继承,把协议中的方法在实现的类中重写。

53.定义属性时,什么情况使用copyassign,和retainassign用于简单数据类型,如NSInteger,double,bool,retaincopy用户对象,
copy用于当a指向一个对象,b也想指向同样的对象的时候,如果用assign,a如果释放,再调用b会crash,如果用copy 的方式,a和b各自有自己的内存,就可以解决这个问题。
retain 会使计数器加一,也可以解决assign的问题。另外:atomic和nonatomic用来决定编译器生成的gettersetter是否为原子操作。在多线程环境下,原子操作是必要的,否则有可能引起错误的结果。加了atomic,setter函数会变成下面这样:

54. ViewController 的 loadView,viewDidLoad, viewDidUnload 分别是在什么时候调用的?在自定义ViewController的时候这几个函数里面应该做什么工作?
答:viewDidLoad在view 从nib文件初始化时调用,loadView在controller的view为nil时调用。此方法在编程实现view时调用,view 控制器默认会注册memory warning notification,当view controller的任何view 没有用的时候,viewDidUnload会被调用,在这里实现将retain 的view release,如果是retainIBOutlet view 属性则不要在这里release,IBOutlet会负责release 。

55. UIViewCALayer 有什么区别?
两者最大的区别是,图层不会直接渲染到屏幕上。

56、Objective-C有私有方法么,私有变量呢
(1)OC类里面的方法只有两种,静态方法和实例方法,没有私有方法,Objective-C不能将类的方法定义为私有的,但是如果想要实现私有方法这种功能的话,可以在.m文件中定义一个.h文件里面没有声明的方法,其他子类不能调用此方法,但是如果要强制调用的话,编译器会警告,但是运行不会出错,而且是会调用到父类里.m的代码,所以Objective-C里面没有绝对的私有方法。
(2)Objective-C中,所有的实例变量默认都是@protected受保护的,只有本类和子类可以访问。
访问控制修饰符, @private修饰私有变量,@public修饰公有变量,@protected类外不可访问子类可访问,所有的实例变量默认均为@protected57.关键字const的含义
答:const意味着“只读”;
const int a;int const a; 代表:a是一个常整型数。
Const int * a;代表:a是一个指向常整型数的指针,整型数是不可修改的,但指针可以
Int * const a;代表:a是一个指向整型数的常指针,指针指向的整型数是可以修改的,但指针不可修改;
Int const * a const;代表:a是一个指向常整型数的常指针,指针指向的整型数不可修改,同时指针也不可修改;
如果想要阻止一个变量被改变,可以使用const关键字,在定义const变量时,通常需要对它进行初始化,因为以后就没有机会再去改变他了。

58static作用
该变量的内存只被分配一次,因此其值在下次调用时仍维持上次的值;

59#import和#include的区别,@class代表什么
答:@class告诉编译器这个类是存在的,但是实现的话,在m文件中还是需要使用#import#import比起#include的好处就是不会引起重复包含

60、线程和进程的区别
答:进程和线程都是程序运行的基本单元,系统利用该基本单元实现系统对应用的并发性。
主要差别在于是不同的操作系统资源管理方式。
进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。
线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,但在进程切换时,耗费资源较大,效率要差一些。
对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。

61、堆和栈的区别?
答:堆和栈是两种数据结构。对于栈来讲,是由编译器自动管理,无需我们手工控制;对于堆来说,释放工作由程序员控制,容易产生内存泄露。

62.如何理解IOS的内存管理
new alloc copy retain这些对象我们都要主动release或者autorele
类方法创建的对象,系统自动释放池自动在适当的时候会帮我们release
ARC自动帮我们智能添加release autorelease操作
内存管理原则:1.谁创建谁释放  2.retain和release配对

63。什么时候使用NSMutableArray,什么时候使用NSArray?
答案:当数组在程序运行时,需要不断变化的,使用NSMutableArray,当数组在初始化后,便不再改变的,使用NSArray。需要指出的是,使用NSArray只表明的是该数组在运行时不发生改变,即不能往NSAarry的数组里新增和删除元素,但不表明其数组內的元素的内容不能发生改变。NSArray是线程安全的,NSMutableArray不是线程安全的,多线程使用到NSMutableArray需要注意。

64.什么是简便构造方法?
答案:简便构造方法一般由CocoaTouch框架提供,如NSNumber的+numberWithBool:+numberWithChar:+numberWithDouble:+numberWithFloat:+numberWithInt:
Foundation下大部分类均有简便构造方法,我们可以通过简便构造方法,获得系统给我们创建好的对象,并且不需要手动释放。

65.在iPhone应用中如何保存数据?
答案:有以下几种保存机制:
1.通过web服务,保存在服务器上
2.通过NSCoder固化机制,将对象保存在文件中
3.通过SQlite或CoreData保存在文件数据库中

66.什么是coredata?
答案:coredata是苹果提供一套数据保存框架,其基于SQlite

67、什么是Cocoa
答:Cocoa是苹果面向对象的开发框架,用来生成Max Osx的应用程序,主要的编程语言是Objective-c,编程工具是Xcode。

68. 什么是block?block实现原理?
答:block是一个特殊的OC对象, 它建立在栈上, 而不是堆上, 这么做一个是为性能考虑,还有就是方便访问局部变量。
默认情况下block使用到的局部变量都会被复制,而不是保留。所以它无法改变局部变量的值。
如果在变量面前加上__block, 那么编译器回去不会复制变量, 而是去找变量的地址, 通过地址来访问变量, 实际上就是直接操作变量。
另外block是在栈上分配的, 所以一旦离开作用域, 就会释放, 因此如果你要把快用在别的地方, 必须要复制一份。
block是不能保留的, retain对块没有意义。

69. 谈谈对Block 的理解?并写出一个使用Block执行UIVew动画?
答案:Block是可以获取其他函数局部变量的匿名函数,其不但方便开发,并且可以大幅提高应用的执行效率(多核心CPU可直接处理Block指令)
[UIView transitionWithView:self.view duration:0.2 options:UIViewAnimationOptionTransitionFlipFromLeft animations:^{ [[blueViewController view] removeFromSuperview]; [[self view] insertSubview:yellowViewController.view atIndex:0]; } completion:NULL]; 

70.写出上面代码的Block的定义。
答案:
typedef void(^animations) (void);
typedef void(^completion) (BOOL finished);

71.试着使用+beginAnimations:context:以及上述Block的定义,写出一个可以完成
+ (void)transitionWithView:(UIView *)view duration:(NSTimeInterval)duration options:(UIViewAnimationOptions)options animations:(void (^)(void))animations completion:(void (^)(BOOL finished))completion NS_AVAILABLE_IOS(4_0);操作的函数执行部分

72.简单介绍下NSURLConnection类及+sendSynchronousRequest:returningResponse:error:与–initWithRequest:delegate:两个方法的区别?
答案: NSURLConnection主要用于网络访问,其中+sendSynchronousRequest:returningResponse:error:是同步访问数据,即当前线程会阻塞,并等待request的返回的response,
而–initWithRequest:delegate:使用的是异步加载,当其完成网络访问后,会通过delegate回到主线程,并其委托的对象。

OC部分
73.定义属性的时候,什么时候使用retain/copy/assign?写一个setter方法,用于完成@property(nonatomic,retain) NSString* name; 写一个setter方法,用于完成@property(nonatomic,copy) NSString* name; 
retain 用于保留对象的引用计数,在使用retain声明的属性做赋值的时候,成员变量指针会保留被赋值对象的引用计数。
copy 声明的属性,在使用属性赋值的时候会,成员指针会指向新副本,这个副本是一个不可变副本,不论赋值对象是不是可变的。

retain声明的属性的setter方法展开
- (void)setName:(NSString*)name
{
     if(_name != name)
        {
            [_name release];
            _name = [name retain];
        }
}
copy声明的属性的setter方法展开
- (void)setName:(NSString*)name
{
     if(_name != name)
        {
            [_name release];
            _name = [name copy];
        }
}

74.实现字符串“I LOVE CHINA”反串成“CHINA LOVE I”

75. 怎样解决重复编译
#ifndef _DEBUG 
#ifdef USE_MYLIB 
................
#endif

76. LayoutSubviews何时会被调用
当要调整subViews时候,需要重写layoutSubviews方法。
1:初始化init方法时候不会触发。 
2:滚动UIScrollView时会触发
3:旋转UIScreen时会触发
4:当改变view的值时候会触发,前提是frame前后值发生了变化
5:当改变UIview的大小时候会触发

77.写一个“标准”宏,这个宏输入两个参数并返回较小的
#define MIN(X,Y)  ((X)>(Y)?(Y):(X))

78. iPhone OS中有没有垃圾回收?
没有

79. 常见的object-c的数据类型有哪些,和c的基本类型有什么区别
答:常见的object-c的数据类型有NSIntegerCGFloatNSStringNSNumberNSArrayNSDataNSInteger会根据系统是32位还是64位来决定是本身是int还是Long,
CGFloat会根据系统是32位还是64位来决定是本身是float还是double,NSStringNSNumberNSArrayNSData都是指针类型的对象,在堆中分配空间,而c语言中的char,[]等都是在栈中分配空间

80.nil对象发送消息会发生什么?
答:在Objective-C中向nil发送消息是完全有效的,只是在运行时不会有任何作用。

81. socket通信的几个关键步骤
面向连接的socket通信就像与对方打电话,首先需要通过电话建立一个连接,连接建立好之后,彼此才能双向通信。它有几个关键步骤
服务器端通常以守护进程的方式实现:
1: 创建守护进程
2:获取或注册服务
3:创建socket并绑定地址
4:开始监听
5:接收客户端连接请求
6:进行数据传输
客户端
1:获取或注册服务
2:创建socket
3:发送连接请求

82. Core Foundation中提供了哪几种操作Socket的方法?
CFNetworkCFSocket和BSD Socket

83.下面的数据结构中不属于线性结构的是:栈,链表,二叉树,线性表
    线性结构:栈,链表,线性表
    非线性结构:二叉树

编程:
1.写出@proerty(nonatomic,retain)Person *person;@synthesize person具体实现。
- (void)setPerson:(Person *)person
{
    if(_person != person){
      [_person release];
      [_person = person retain];
 }
}

- (Person *)person
{
 return _person;
}

84. 从普通id类型对象转换成数字对象,因为配置了限定词.1f,所以结果四舍五入,并保留一位小数
NSDictionary* rowData = [NSDictionarydictionaryWithObjectsAndKeys:@"46.95",@"price",nil];
NSLog(@"a double value:%.1f",[(NSNumber*)[rowData objectForKey:@"price"] doubleValue]);
输出:
a double value:47.0

85,写一个委托的interface

    #import
    @protocol MyDelegate;//声明
    @interface MyClass:NSobject
    {
         id    delegate;
    }
    @end
    @protocol MyDelegate//委托方法
    -(void)  selector:(NSString *)  args;
    @end

86:请看下面一段代码
        static int a=1;
        int main(){
            int b=2;
            char* c=NUll;
            c=(char*)malloc(100*sizeof(char));
            return 0;
        }
问:1,访问abc三者的效率从高到低依次是   
       bca

    2,在最坏情况下排序速度最快的是:归并排序
        复杂度最高的是:快排
        a,快排,冒泡,堆,归并

87.看下面的程序
=========================================
        NSMutableArray *arr = [[NSMutableArray array] retain];
        NSString *str = [NSString stringWithFormat:@"test"];

        [str retain];
        [arr addObject:str];
        NSLog(@"%@%lu",str,[str retainCount]);
        [str retain];
        [str release];
        [str release];
        NSLog(@"%@%lu",str,[str retainCount]);
        [arr removeObject:str];
        NSLog(@"%@%lu",str,[str retainCount]);
==================================================
三次打印的retainCount分别是什么,为什么?

分别是321,
初始化的时候的为1retain的时候+1,往数组里add的时候+1,release的时候-1,从数组里移除的时候-1
点赞
收藏
暂无评论,快来发表评论吧~
私信
老牛@ilaoniu
老牛,俗称哞哞。单纯的九零后理工小青年。喜欢折腾,爱玩,爱音乐,爱游戏,爱电影,爱旅游...
最后活跃于