oc面试攻略Followyourheart

1、Object-C有多继承吗?没有的话用什么代替?cocoa中所有的类都是NSObject的子类

多继承在这里是用protocol委托代理来实现的

你不用去考虑繁琐的多继承,虚基类的概念.

ood的多态特性在obj-c中通过委托来实现.

2、Object-C有私有方法吗?私有变量呢?

objective-c–类里面的方法只有两种,静态方法和实例方法.这似乎就不是完整的面向对象了,按照OO的原则就是一个对象只暴露有用的东西.如果没有了私有方法的话,对于一些小范围的代码重用就不那么顺手了.在类里面声名一个私有方法

@interfaceController:NSObject{NSString*something;}

+(void)thisIsAStaticMethod;

–(void)thisIsAnInstanceMethod;

@end

@interfaceController(private)-

(void)thisIsAPrivateMethod;

@private可以用来修饰私有变量

在Objective‐C中,所有实例变量默认都是私有的,所有实例方法默认都是公有的

3、关键字const什么含义?

constinta;

intconsta;

constint*a;

int*consta;

intconst*aconst;

前两个的作用是一样,a是一个常整型数。第三个意味着a是一个指向常整型数的指针(也就是,整型数是不可修改的,但指针可以)。第四个意思a是一个指向整型数的常指针(也就是说,指针指向的整型数是可以修改的,但指针是不可修改的)。最后一个意味着a是一个指向常整型数的常指针(也就是说,指针指向的整型数是不可修改的,同时指针也是不可修改的)。

结论:

;通过给优化器一些附加的信息,使用关键字const也许能产生更紧凑的代码。

;合理地使用关键字const可以使编译器很自然地保护那些不希望被改变的参数,防止其被无意的代码修改。简而言之,这样可以减少bug的出现。

欲阻止一个变量被改变,可以使用const关键字。在定义该const变量时,通常需要对它进行初

始化,因为以后就没有机会再去改变它了;

(2)对指针来说,可以指定指针本身为const,也可以指定指针所指的数据为const,或二者同时指定为const;

(4)对于类的成员函数,若指定其为const类型,则表明其是一个常函数,不能修改类的成员变量;

(5)对于类的成员函数,有时候必须指定其返回值为const类型,以使得其返回值不为“左值”。

4、关键字volatile有什么含义?并给出三个不同例子?

一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到

这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。下面是volatile变量的几个例子:

并行设备的硬件寄存器(如:状态寄存器)

一个中断服务子程序中会访问到的非自动变量(Non-automaticvariables)

多线程应用中被几个任务共享的变量

一个参数既可以是const还可以是volatile吗?解释为什么。

一个指针可以是volatile吗?解释为什么。

下面是答案:

是的。一个例子是只读的状态寄存器。它是volatile因为它可能被意想不到地改变。它是const因为程序不应该试图去修改它。

是的。尽管这并不很常见。一个例子是当一个中服务子程序修该一个指向一个buffer的指针时。

static作用?

函数体内static变量的作用范围为该函数体,不同于auto变量,该变量的内存只被分配一次,

因此其值在下次调用时仍维持上次的值;

(2)在模块内的static全局变量可以被模块内所用函数访问,但不能被模块外其它函数访问;

它的模块内;

(4)在类中的static成员变量属于整个类所拥有,对类的所有对象只有一份拷贝;

(5)在类中的static成员函数属于整个类所拥有,这个函数不接收this指针,因而只能访问类的static成员变量。

6、#import和#include的区别,@class代表什么?

而#import比起#include的好处就是不会引起重复包含

7、线程和进程的区别?

进程和线程都是由操作系统所体会的程序运行的基本单元,系统利用该基本单元实现系统对应用的并发性。

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

8、堆和栈的区别?

管理方式:对于栈来讲,是由编译器自动管理,无需我们手工控制;对于堆来说,释放工作由程序员控制,容易产生memoryleak。

申请大小:

栈:在Windows下,栈是向低地址扩展的数据结构,是一块连续的内存的区域。这句话的意思是栈顶的地址和栈的最大容量是系统预先规定好的,在WINDOWS下,栈的大小是2M(也有的说是1M,总之是一个编译时就确定的常数),如果申请的空间超过栈的剩余空间时,将提示overflow。因此,能从栈获得的空间较小。

堆:堆是向高地址扩展的数据结构,是不连续的内存区域。这是由于系统是用链表来存储的空闲内存地址的,自然是不连续的,而链表的遍历方向是由低地址向高地址。堆的大小受限于计算机系统中有效的虚拟内存。由此可见,堆获得的空间比较灵活,也比较大。

碎片问题:对于堆来讲,频繁的new/delete势必会造成内存空间的不连续,从而造成大量的碎片,使程序效率降低。对于栈来讲,则不会存在这个问题,因为栈是先进后出的队列,他们是如此的一一对应,以至于永远都不可能有一个内存块从栈中间弹出

分配方式:堆都是动态分配的,没有静态分配的堆。栈有2种分配方式:静态分配和动态分配。静态分配是编译器完成的,比如局部变量的分配。动态分配由alloca函数进行分配,但是栈的动态分配和堆是不同的,他的动态分配是由编译器进行释放,无需我们手工实现。

分配效率:栈是机器系统提供的数据结构,计算机会在底层对栈提供支持:分配专门的寄存器存放栈的地址,压栈出栈都有专门的指令执行,这就决定了栈的效率比较高。堆则是C/C++函数库提供的,它的机制是很复杂的。

9、Object-C的内存管理?

1.当你使用new,alloc和copy方法创建一个对象时,该对象的保留计数器值为1.当你不再使用该对象时,你要负责向该对象发送一条release或autorelease消息.这样,该对象将在使用寿命结束时被销毁.

3.如果你保留了某个对象,你需要(最终)释放或自动释放该对象.必须保持retain方法和release方法的使用次数相等.

10、为什么很多内置的类,如TableViewController的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模式时,也要注意这点。

11、定义属性时,什么情况使用copy、assign、retain?

assign用于简单数据类型,如NSInteger,double,bool,

retain和copy用于对象,

copy用于当a指向一个对象,b也想指向同样的对象的时候,如果用assign,a如果释放,再调用b会crash,如果用copy的方式,a和b各自有自己的内存,就可以解决这个问题。

retain会使计数器加一,也可以解决assign的问题。

另外:atomic和nonatomic用来决定编译器生成的getter和setter是否为原子操作。在多线程环境下,原子操作是必要的,否则有可能引起错误的结果。

加了atomic,setter函数会变成下面这样:

if(property!=newValue){

[propertyrelease];

property=[newValueretain];

}

12、对象是什么时候被release的?

引用计数为0时。

autorelease实际上只是把对release的调用延迟了,对于每一个Autorelease,系统只是把该Object放入了当前的Autoreleasepool中,当该pool被释放时,该pool中的所有Object会被调用Release。对于每一个Runloop,系统会隐式创建一个Autoreleasepool,这样所有的releasepool会构成一个象CallStack一样的一个栈式结构,在每一个Runloop结束时,当前栈顶的Autoreleasepool会被销毁,这样这个pool里的每个Object(就是autorelease的对象)会被release。那什么是一个Runloop呢?一个UI事件,Timercall,delegatecall,都会是一个新的Runloop

13、iOS有没有垃圾回收?

Objective-C2.0也是有垃圾回收机制的,但是只能在MacOSXLeopard10.5以上的版本使用。

14、tableView的重用机制?

查看UITableView头文件,会找到NSMutableArray*visiableCells,和NSMutableDictnery*reusableTableCells两个结构。visiableCells内保存当前显示的cells,reusableTableCells保存可重用的cells。

TableView显示之初,reusableTableCells为空,那么tableViewdequeueReusableCellWithIdentifier:CellIdentifier返回nil。开始的cell都是通过[[UITableViewCellalloc]initWithStyle:UITableViewCellStyleDefaultreuseIdentifier:CellIdentifier]来创建,而且cellForRowAtIndexPath只是调用最大显示cell数的次数。

比如:有100条数据,iPhone一屏最多显示10个cell。程序最开始显示TableView的情况是:

1.用[[UITableViewCellalloc]initWithStyle:UITableViewCellStyleDefaultreuseIdentifier:CellIdentifier]创建10次cell,并给cell指定同样的重用标识(当然,可以为不同显示类型的cell指定不同的标识)。并且10个cell全部都加入到visiableCells数组,reusableTableCells为空。

2.向下拖动tableView,当cell1完全移出屏幕,并且cell11(它也是alloc出来的,原因同上)完全显示出来的时候。cell11加入到visiableCells,cell1移出visiableCells,cell1加入到reusableTableCells。

3.接着向下拖动tableView,因为reusableTableCells中已经有值,所以,当需要显示新的cell,cellForRowAtIndexPath再次被调用的时候,tableViewdequeueReusableCellWithIdentifier:CellIdentifier,返回cell1。cell1加入到visiableCells,cell1移出reusableTableCells;cell2移出visiableCells,cell2加入到reusableTableCells。之后再需要显示的Cell就可以正常重用了。

15、ViewController的loadView、viewDidLoad、viewDidUnload分别是什么时候调用的,在自定义ViewCointroller时在这几个函数中应该做什么工作?

由init、loadView、viewDidLoad、viewDidUnload、dealloc的关系说起

init方法

在init方法中实例化必要的对象(遵从LazyLoad思想)

init方法中初始化ViewController本身

loadView方法

当view需要被展示而它却是nil时,viewController会调用该方法。不要直接调用该方法。

如果手工维护views,必须重载重写该方法

如果使用IB维护views,必须不能重载重写该方法

loadView和IB构建view

你在控制器中实现了loadView方法,那么你可能会在应用运行的某个时候被内存管理控制调用。如果设备内存不足的时候,view控制器会收到didReceiveMemoryWarning的消息。默认的实现是检查当前控制器的view是否在使用。如果它的view不在当前正在使用的viewhierarchy里面,且你的控制器实现了loadView方法,那么这个view将被release,loadView方法将被再次调用来创建一个新的view。

viewDidLoad方法

viewDidLoad此方法只有当view从nib文件初始化的时候才被调用。

重载重写该方法以进一步定制view

在iPhoneOS3.0及之后的版本中,还应该重载重写viewDidUnload来释放对view的任何索引

viewDidLoad后调用数据Model

viewDidUnload方法

当系统内存吃紧的时候会调用该方法(注:viewController没有被dealloc)

内存吃紧时,在iPhoneOS3.0之前didReceiveMemoryWarning是释放无用内存的唯一方式,但是OS3.0及以后viewDidUnload方法是更好的方式

在该方法中将所有IBOutlet(无论是property还是实例变量)置为nil(系统releaseview时已经将其release掉了)

在该方法中释放其他与view有关的对象、其他在运行时创建(但非系统必须)的对象、在viewDidLoad中被创建的对象、缓存数据等release对象后,将对象置为nil(IBOutlet只需要将其置为nil,系统releaseview时已经将其release掉了)

一般认为viewDidUnload是viewDidLoad的镜像,因为当view被重新请求时,viewDidLoad还会重新被执行

viewDidUnload中被release的对象必须是很容易被重新创建的对象(比如在viewDidLoad或其他方法中创建的对象),不要release用户数据或其他很难被重新创建的对象

dealloc方法

viewDidUnload和dealloc方法没有关联,dealloc还是继续做它该做的事情

16、ViewController的didReceiveMemoryWarning是在什么时候调用的?默认的操作是什么?

当程序接到内存警告时ViewController将会收到这个消息:didReceiveMemoryWarning

从iOS3.0开始,不需要重载这个函数,把释放内存的代码放到viewDidUnload中去。

这个函数的默认实现是:检查controller是否可以安全地释放它的view(这里加粗的view指的是controller的view属性),比如view本身没有superview并且可以被很容易地重建(从nib或者loadView函数)。

如果view可以被释放,那么这个函数释放view并调用viewDidUnload。

你可以重载这个函数来释放controller中使用的其他内存。但要记得调用这个函数的super实现来允许父类(一般是UIVIewController)释放view。

如果你的ViewController保存着view的子view的引用,那么,在早期的iOS版本中,你应该在这个函数中来释放这些引用。而在iOS3.0或更高版本中,你应该在viewDidUnload中释放这些引用。

17、列举Cocoa中常见的集中多线程的实现,并谈谈多线程安全的几种解决办法,一般什么地方会用到多线程?

NSThread,GCD等。尽量用上层分装好的方法去实现多线程而不是手动调用NSThread。

18、怎么理解MVC,在Cocoa中MVC是怎么实现的?

Model:代表你的应用程序是什么(不是怎么展现)

Controller:控制你的Model怎么展现给用户(UI逻辑)

View:Controller的奴隶。。。

1Model,Controller,View相互通讯的规则:

Controller可以直接和Model通信

Controller也可以直接和View通信

Model和View永远不能直接通信

iOS中View和Controller的通信是透明和固定的,主要通过outlet和action实现

View使用Delegate接口和Controller同步信息

View不直接和数据通信,使用dataSource接口从Controller处获取数据

View的delegate和dataSource一般就是Controller

Controller负责为View翻译和格式化Model的数据

Model使用Notification&KVO的方式分发数据更新信息,Controller可以有选择的监听自己感兴趣的信息。

View也可以监听广播信息,但一般不是Model发出的信息

一个完整的App就是很多MVC的集合

19、delegate和notification区别,分别在什么情况下使用?

Delegate:

消息的发送者(sender)告知接收者(receiver)某个事件将要发生,delegate同意然然后发送者响应事件,delegate机制使得接收者可以改变发送者的行为。通常发送者和接收者的关系是直接的一对多的关系。

Notification:

消息的发送者告知接收者事件已经发生或者将要发送,仅此而已,接收者并不能反过来影响发送者的行为。通常发送者和接收者的关系是间接的多对多关系。

1.效率肯定是delegate比nsnotification高。

1)两个模块之间联系不是很紧密,就用notification传值,例如多线程之间传值用notificaiton。

2)delegate只是一种较为简单的回调,且主要用在一个模块中,例如底层功能完成了,需要把一些值传到上层去,就事先把上层的函数通过delegate传到底层,然后在底层call这个delegate,它们都在一个模块中,完成一个功能,例如说NavgationController从B界面到A点返回按钮(调用popViewController方法)可以用delegate比较好。

20、self.跟self什么区别?

21、id、nil代表什么?

id和void*并非完全一样。在上面的代码中,id是指向structobjc_object的一个指针,这个意思基本上是说,id是一个指向任何一个继承了Object(或者NSObject)类的对象。需要注意的是id是一个指针,所以你在使用id的时候不需要加星号。比如idfoo=nil定义了一个nil指针,这个指针指向NSObject的一个任意子类。而id*foo=nil则定义了一个指针,这个指针指向另一个指针,被指向的这个指针指向NSObject的一个子类。

nil和C语言的NULL相同,在objc/objc.h中定义。nil表示一个Objctive-C对象,这个对象的指针指向空(没有东西就是空)。

首字母大写的Nil和nil有一点不一样,Nil定义一个指向空的类(是Class,而不是对象)。

SEL是“selector”的一个类型,表示一个方法的名字

IMP定义为id(*IMP)(id,SEL,…)。这样说来,IMP是一个指向函数的指针,这个被指向的函数包括id(“self”指针),调用的SEL(方法名),再加上一些其他参数.说白了IMP就是实现方法。

22、内存管理Autorelease、retain、copy、assign的set方法和含义?

1,你初始化(alloc/init)的对象,你需要释放(release)它。例如:

NSMutableArrayaArray=[[NSArrayalloc]init];后,需要[aArrayrelease];

2,你retain或copy的,你需要释放它。例如:

[aArrayretain]后,需要[aArrayrelease];

3,被传递(assign)的对象,你需要斟酌的retain和release。例如:

obj2=[[obj1someMethod]autorelease];

对象2接收对象1的一个自动释放的值,或传递一个基本数据类型(NSInteger,NSString)时:你或希望将对象2进行retain,以防止它在被使用之前就被自动释放掉。但是在retain后,一定要在适当的时候进行释放。

关于索引计数(ReferenceCounting)的问题

retain值=索引计数(ReferenceCounting)

NSArray对象会retain(retain值加一)任何数组中的对象。当NSArray被卸载(dealloc)的时候,所有数组中的对象会被执行一次释放(retain值减一)。不仅仅是NSArray,任何收集类(CollectionClasses)都执行类似操作。例如NSDictionary,甚至UINavigationController。

Alloc/init建立的对象,索引计数为1。无需将其再次retain。

[NSArrayarray]和[NSDatedate]等“方法”建立一个索引计数为1的对象,但是也是一个自动释放对象。所以是本地临时对象,那么无所谓了。如果是打算在全Class中使用的变量(iVar),则必须retain它。

缺省的类方法返回值都被执行了“自动释放”方法。(*如上中的NSArray)

在类中的卸载方法“dealloc”中,release所有未被平衡的NS对象。(*所有未被autorelease,而retain值为1的)

23、类别的作用?

有时我们需要在一个已经定义好的类中增加一些方法,而不想去重写该类。比如,当工程已经很大,代码量比较多,或者类中已经包住很多方法,已经有其他代码调用了该类创建对象并使用该类的方法时,可以使用类别对该类扩充新的方法。

注意:类别只能扩充方法,而不能扩充成员变量。

24、委托(举例)

委托代理(degegate),顾名思义,把某个对象要做的事情委托给别的对象去做。那么别的对象就是这个对象的代理,代替它来打理要做的事。反映到程序中,首先要明确一个对象的委托方是哪个对象,委托所做的内容是什么。

委托机制是一种设计模式,在很多语言中都用到的,这只是个通用的思想,网上会有很多关于这方面的介绍。

那么在苹果开发过程中,用到委托的程序实现思想如下,我主要拿如何在视图之间传输信息做个例子。

譬如:在两个页面(UIIview视图对象)实现传值,用委托(delegate)可以很好做到!

方法:

类A

@interfaceA:UIView

idtransparendValueDelegate;

@property(nomatic,retain)idtransparendValueDelegate;

@implemtionA

@synthesizetransparendValueDelegate

-(void)Function

{

NSString*value=@"hello";

//让代理对象执行transparendValue动作

[transparendValueDelegatetransparendValue:value];

类B

@interfaceB:UIView

NSString*value;

@implemtionB

-(void)transparendValue:(NSString*)fromValue

value=fromValue;

NSLog(@"thevalueis%@",value);

//下面的设置A代理委托对象为B

//在定义A和B类对象处:

A*a=[[Aalloc]init];

B*b=[[Balloc]init];

a.transparendValueDelegate=b;//设置对象a代理为对象b

这样在视图A和B之间可以通过委托来传值!

25、retainCount?

26..属性readwrite,readonly,assign,retain,copy,nonatomic各是什么作用,在那种情况下用

assign:指定setter方法用简单的赋值,这是默认操作。你可以对标量类型(如int)使用这个属性。你可以想象一个float,它不是一个对象,所以它不能retain、copy。

retain:指定retain应该在后面的对象上调用,前一个值发送一条release消息。你可以想象一个NSString实例,它是一个对象,而且你可能想要retain它。

copy:指定应该使用对象的副本(深度复制),前一个值发送一条release消息。基本上像retain,但是没有增加引用计数,是分配一块新的内存来放置它。

readonly:将只生成getter方法而不生成setter方法(getter方法没有get前缀)。

readwrite:默认属性,将生成不带额外参数的getter和setter方法(setter方法只有一个参数)。

nonatomic:不保证setter/getter的原子性,多线程情况下数据可能会有问题。

Objective-C对存取权限的设定。也是变量的作用域。

protected该类和所有的子类中的方法可以直接访问这样的变量,这是默认的。

private—该类中的方法可以访问这样的变量,子类不可以。public—除了自己和子类中的方法外,也可以被其他类或者其他模块中的方法所访问。开放性最大。package—对于64位图像,这样的成员变量可以在实现这个类的图像中随意访问。

28.浅拷贝和深拷贝区别是什么

简单的来说就是,在有指针的情况下,浅拷贝只是增加了一个指针指向已经存在的内存,而深拷贝就是增加一个指针并且申请一个新的内存,使这个增加的指针指向这个新的内存,采用深拷贝的情况下,释放内存的时候就不会出现在浅拷贝时重复释放同一内存的错误

29.Cocoa中与虚基类的概念么?怎么简洁的实现

30.NSString和NSMutableString有什么区别

NSString相当于一个constchar*不可以改变。

而NSMutableString相当于char*可以改变内部的内容。

31.自动释放池跟GC有什么区别?iPhone上有GC么?[poolrelease]和[pooldrain]有什么区别

”AutoreleasePools”(自动释放池)在应用中的使用技巧。

1,AutoreleasePools概要

一个”AutoreleasePool”实例中“包含”其它各种调用了”autorelease”方法的对象。当它释放时,其中所有被管理对象都会收到”relrease”的消信。注意,同一个对象可以被多次调用”autorelease”方法,并可以放到同一个”AutoreleasePool”中。引入这个自动释放池机制,对象的”autorelease”方法代替”relrease”方法可以延长它的生命周期,直接到当前”AutorelreasePool”释放。如果想让此对象的生命周期超过”AutoreleasePool”,还可以再次”retain”,呵呵,有意思吧且让我慢慢道来。

Cocoa总是认为当前至少有一个”AutoreleasePool”对象是可用的。若此对象并不存在,你调用的”autorelease”的所有对象都不会被自动释放掉,可想而知,造成内存泄露。Cocoa把这个错误信息写入日志仅仅是为了以后分析。

你可以用”alloc”与”init”方法创建一个”NSAutoreleasePool”对象,并且可以调用”release”或”drain”(”release”与”drain”的区别是”drain”在有GC的环境中会引起GC回收操作,”release”反之。但在非GC环境中,两者相同。官方的说法是为了程序的兼容性,应该考虑用”drain”代替”release”,)方法来回收它(调用它的”autorelease”或”retain”方法会引起异常)。在一个完整的上下文最后”AutoreleasePool”对象应该被”release”掉(在方法内或一段循环体内创建的”AutoreleasePool”对象)。

“AutoreleasePools”的所有实例在栈中管理(我们暂时叫他“自动释放池栈”),并且它们是可以被嵌套的(父生子,子生孙。。。子子孙孙^_^)。例如,当我们创建一个”AutoreleasePool”对象后,它就被自动放到“自动释放池栈”的栈顶。当本池对象回收时,它就随之从这个栈中POP掉。那么也就是说,当任何一个对象调用”autorelease”方法后,它会被放入当前线程中当前栈顶的自动释放池中。

“Applicationkit”在一个事件循环里会自动创建一个”autoreleasepool”。像鼠标键的按下与释放,所以你编写的代码通常不需要考虑太多这方面的事情。当然,有以下三种情况你会创建与销毁自己的Pool实例:

1,应用不是基于”ApplicationKit”,像”Command-linetool”,因为它并没有内置的”autoreleasepools”的支持。

3,一个循环内创建了太多的临时对象,你应该为他们创建一个”AutoreleasePool”对象,并在下次循还前销毁它们。

2,自动释放池中的”Non-AppKit”应用

在”Non-AppKit”应用中使用自动释放池的机制其实是相当简单的事情。你仅仅需要在main()起始处创建”AutoreleasePool”对象,并在结尾处释放掉它。就像在Xcode的FoundationTool的创建模版里写的一样。这个确保你在应用生命周期内至少有一个”AutoreleasePool”是可用的。但是,这也使所有在此期间的所有”autorelease”的对象都必需在应用结束后才被释放。这也许会引起在应用的使用中不断的增长,所以,你仍然考虑在不同的作用域创建新的”AutoreleasePool”。

大多应用中都存在各种级别的循环机制。在这些应用中,你可以在每个循环内的开头创建一个”AutoreleasePool”对象,并在结尾处释放掉它。

例如:

voidmain()

NSAutoreleasePool*pool=[[NSAutoreleasePoolalloc]init];

NSArray*args=[[NSProcessInfoprocessInfo]arguments];

unsignedcount,limit=[argscount];

for(count=0;count

NSAutoreleasePool*loopPool=[[NSAutoreleasePoolalloc]init];

NSString*fileContents;

NSString*fileName;

fileName=[argsobjectAtIndex:count];

fileContents=[[[NSStringalloc]initWithContentsOfFile:fileName]autorelease];

//thisisequivalenttousingstringWithContentsOfFile:

[loopPoolrelease];

[pooldrain];

exit(EXIT_SUCCESS);

在命令行中处理所有以参数传来的文件。一次循环处理一个文件。在循环的开头创建一个”NSAutoreleasePool”对象,并在循环结束时释放掉。因此,任何在其中创建并调用“autorelease”的对象都将添加到这个Pool实例中,当本池被释放后,这些对象也将被回收。注意,任何在作用域内创建的”autoreleased”对象(像”fileName”),虽然并没有显示的调用”autorelease”方法,但都将被当前池所管理并释放。

32.C和obj-c如何混用

1)obj-c的编译器处理后缀为m的文件时,可以识别obj-c和c的代码,处理mm文件可以识别obj-c,c,c++代码,但cpp文件必须只能用c/c++代码,而且cpp文件include的头文件中,也不能出现obj-c的代码,因为cpp只是cpp

2)在mm文件中混用cpp直接使用即可,所以obj-c混cpp不是问题

3)在cpp中混用obj-c其实就是使用obj-c编写的模块是我们想要的。

如果模块以类实现,那么要按照cppclass的标准写类的定义,头文件中不能出现obj-c的东西,包括#importcocoa的。实现文件中,即类的实现代码中可以使用obj-c的东西,可以import,只是后缀是mm。

总结:只要cpp文件和cppinclude的文件中不包含obj-c的东西就可以用了,cpp混用obj-c的关键是使用接口,而不能直接使用实现代码,实际上cpp混用的是obj-c编译后的o文件,这个东西其实是无差别的,所以可以用。obj-c的编译器支持cpp

33.响应者链是什么

响应者链是ApplicationKit事件处理架构的中心机制。它由一系列链接在一起的响应者对象组成,事件或者动作消息可以沿着这些对象进行传递。如图6-20显示的那样,如果一个响应者对象不能处理某个事件或动作-也就是说,它不响应那个消息,或者不认识那个事件,则将该消息重新发送给链中的下一个响应者。消息沿着响应者链向上、向更高级别的对象传递,直到最终被处理(如果最终还是没有被处理,就会被抛弃)。

当ApplicationKit在应用程序中构造对象时,会为每个窗口建立响应者链。响应者链中的基本对象是NSWindow对象及其视图层次。在视图层次中级别较低的视图将比级别更高的视图优先获得处理事件或动作消息的机会。NSWindow中保有一个第一响应者的引用,它通常是当前窗口中处于选择状态的视图,窗口通常把响应消息的机会首先给它。对于事件消息,响应者链通常以发生事件的窗口对应的NSWindow对象作为结束,虽然其它对象也可以作为下一个响应者被加入到NSWindow对象的后面。

34..UIscrollVew用到了什么设计模式?还能再foundation库中找到类似的吗?

组合模式composition,所有的containerview都用了这个模式

观察者模式observer,所有的UIResponder都用了这个模式。

模板(Template)模式,所有datasource和delegate接口都是模板模式的典型应用

33..timer的间隔周期准吗?为什么?怎样实现一个精准的timer

NSTimer可以精确到50-100毫秒.

NSTimer不是绝对准确的,而且中间耗时或阻塞错过下一个点,那么下一个点就pass过去了

此份面试题包含40个题目,是现在网上能搜索到的一个比较热的一份,但是答案并不是很详细和完整,基本答案来着cocoaChina,和一些自己的补充。

34.Differencebetweenshallowcopyanddeepcopy

浅复制和深复制的区别?

答案:浅层复制:只复制指向对象的指针,而不复制引用对象本身。

深层复制:复制引用对象本身。

意思就是说我有个A对象,复制一份后得到A_copy对象后,对于浅复制来说,A和A_copy指向的是同一个内存资源,复制的只不过是是一个指针,对象本身资源

还是只有一份,那如果我们对A_copy执行了修改操作,那么发现A引用的对象同样被修改,这其实违背了我们复制拷贝的一个思想。深复制就好理解了,内存中存在了

两份独立对象本身。

用网上一哥们通俗的话将就是:

浅复制好比你和你的影子,你完蛋,你的影子也完蛋

深复制好比你和你的克隆人,你完蛋,你的克隆人还活着。

35.WhatisadvantageofcategoriesWhatisdifferencebetweenimplementingacategoryandinheritance

类别的作用?继承和类别在实现中有何区别?

答案:category可以在不获悉,不改变原来代码的情况下往里面添加新的方法,只能添加,不能删除修改。

并且如果类别和原来类中的方法产生名称冲突,则类别将覆盖原来的方法,因为类别具有更高的优先级。

类别主要有3个作用:

(1)将类的实现分散到多个不同文件或多个不同框架中。

(2)创建对私有方法的前向引用。

(3)向对象添加非正式协议。

继承可以增加,修改或者删除方法,并且可以增加属性。

36.Differencebetweencategoriesandextensions

类别和类扩展的区别。

答案:category和extensions的不同在于后者可以添加属性。另外后者添加的方法是必须要实现的。

extensions可以认为是一个私有的Category。

37.Differencebetweenprotocolinobjectivecandinterfacesinjava

oc中的协议和java中的接口概念有何不同?

答案:OC中的代理有2层含义,官方定义为formal和informalprotocol。前者和Java接口一样。

informalprotocol中的方法属于设计模式考虑范畴,不是必须实现的,但是如果有实现,就会改变类的属性。

其实关于正式协议,类别和非正式协议我很早前学习的时候大致看过,也写在了学习教程里

“非正式协议概念其实就是类别的另一种表达方式“这里有一些你可能希望实现的方法,你可以使用他们更好的完成工作”。

这个意思是,这些是可选的。比如我门要一个更好的方法,我们就会申明一个这样的类别去实现。然后你在后期可以直接使用这些更好的方法。

这么看,总觉得类别这玩意儿有点像协议的可选协议。"

现在来看,其实protocal已经开始对两者都统一和规范起来操作,因为资料中说“非正式协议使用interface修饰“,

现在我们看到协议中两个修饰词:“必须实现(@requied)”和“可选实现(@optional)”。

38.WhatareKVOandKVC

答案:kvc:键-值编码是一种间接访问对象的属性使用字符串来标识属性,而不是通过调用存取方法,直接或通过实例变量访问的机制。

很多情况下可以简化程序代码。apple文档其实给了一个很好的例子。

kvo:键值观察机制,他提供了观察某一属性变化的方法,极大的简化了代码。

具体用看到嗯哼用到过的一个地方是对于按钮点击变化状态的的监控。

比如我自定义的一个button

[cpp]

[selfaddObserver:selfforKeyPath:@"highlighted"options:0context:nil];

#pragmamarkKVO

-(void)observeValueForKeyPath:(NSString*)keyPathofObject:(id)objectchange:(NSDictionary*)changecontext:(void*)context

([keyPathisEqualToString:@"highlighted"]){

[selfsetNeedsDisplay];

对于系统是根据keypath去取的到相应的值发生改变,理论上来说是和kvc机制的道理是一样的。

对于kvc机制如何通过key寻找到value:

“当通过KVC调用对象时,比如:[selfvalueForKey:@”someKey”]时,程序会自动试图通过几种不同的方式解析这个调用。首先查找对象是否带有someKey这个方法,如果没找到,会继续查找对象是否带有someKey这个实例变量(iVar),如果还没有找到,程序会继续试图调用-(id)valueForUndefinedKey:这个方法。如果这个方法还是没有被实现的话,程序会抛出一个NSUndefinedKeyException异常错误。

(cocoachina.com注:Key-ValueCoding查找方法的时候,不仅仅会查找someKey这个方法,还会查找getsomeKey这个方法,前面加一个get,或者_someKey以及_getsomeKey这几种形式。同时,查找实例变量的时候也会不仅仅查找someKey这个变量,也会查找_someKey这个变量是否存在。)

设计valueForUndefinedKey:方法的主要目的是当你使用-(id)valueForKey方法从对象中请求值时,对象能够在错误发生前,有最后的机会响应这个请求。这样做有很多好处,下面的两个例子说明了这样做的好处。“

来至cocoa,这个说法应该挺有道理。

可以按照kvc查找的逻辑理解,就说的过去了。

39.Whatispurposeofdelegates

代理的作用?

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

另外一点,代理可以理解为java中的回调监听机制的一种类似。

40.WhataremutableandimmutabletypesinObjectiveC

oc中可修改和不可以修改类型。

答案:可修改不可修改的集合类。这个我个人简单理解就是可动态添加修改和不可动态添加修改一样。

比如NSArray和NSMutableArray。前者在初始化后的内存控件就是固定不可变的,后者可以添加等,可以动态申请新的内存空间。

41.Whenwecallobjectivecisruntimelanguagewhatdoesitmean

我们说的oc是动态运行时语言是什么意思?

答案:多态。主要是将数据类型的确定由编译时,推迟到了运行时。

这个问题其实浅涉及到两个概念,运行时和多态。

简单来说,运行时机制使我们直到运行时才去决定一个对象的类别,以及调用该类别对象指定方法。

多态:不同对象以自己的方式响应相同的消息的能力叫做多态。意思就是假设生物类(life)都用有一个相同的方法-eat;

那人类属于生物,猪也属于生物,都继承了life后,实现各自的eat,但是调用是我们只需调用各自的eat方法。

也就是不同的对象以自己的方式响应了相同的消息(响应了eat这个选择器)。

因此也可以说,运行时机制是多态的基础?~~~

42.whatisdifferencebetweenNSNotificationandprotocol

通知和协议的不同之处?

答案:协议有控制链(has-a)的关系,通知没有。

首先我一开始也不太明白,什么叫控制链(专业术语了~)。但是简单分析下通知和代理的行为模式,我们大致可以有自己的理解

简单来说,通知的话,它可以一对多,一条消息可以发送给多个消息接受者。

代理按我们的理解,到不是直接说不能一对多,比如我们知道的明星经济代理人,很多时候一个经济人负责好几个明星的事务。

只是对于不同明星间,代理的事物对象都是不一样的,一一对应,不可能说明天要处理A明星要一个发布会,代理人发出处理发布会的消息后,别称B的

发布会了。但是通知就不一样,他只关心发出通知,而不关心多少接收到感兴趣要处理。

因此控制链(has-a从英语单词大致可以看出,单一拥有和可控制的对应关系。

43.Whatispushnotification

什么是推送消息?

答案:太简单,不作答~~~~~~~~~~

这是cocoa上的答案。

其实到不是说太简单,只是太泛泛的一个概念的东西。就好比说,什么是人。

推送通知更是一种技术。

简单点就是客户端获取资源的一种手段。

普通情况下,都是客户端主动的pull。

推送则是服务器端主动push。

44.Polymorphism?

关于多态性

答案:多态,子类指针可以赋值给父类。

这个题目其实可以出到一切面向对象语言中,

因此关于多态,继承和封装基本最好都有个自我意识的理解,也并非一定要把书上资料上写的能背出来。

最重要的是转化成自我理解。

45.Singleton

对于单例的理解

答案:11,12题目其实出的有点泛泛的感觉了,可能说是编程语言需要或是必备的基础。

基本能用熟悉的语言写出一个单例,以及可以运用到的场景或是你编程中碰到过运用的此种模式的框架类等。

进一步点,考虑下如何在多线程访问单例时的安全性。

46.Whatisresponderchain

说说响应链

答案:事件响应链。包括点击事件,画面刷新事件等。在视图栈内从上至下,或者从下之上传播。

可以说点事件的分发,传递以及处理。具体可以去看下touch事件这块。因为问的太抽象化了

严重怀疑题目出到越后面就越笼统。

47.Differencebetweenframeandbounds

frame和bounds有什么不同?

答案:frame指的是:该view在父view坐标系统中的位置和大小。(参照点是父亲的坐标系统)

bounds指的是:该view在本身坐标系统中的位置和大小。(参照点是本身坐标系统)

48.Differencebetweenmethodandselector

方法和选择器有何不同?

答案:selector是一个方法的名字,method是一个组合体,包含了名字和实现.

详情可以看apple文档。

49.IsthereanygarbagecollectionmechanisminObjectiveC.

OC的垃圾回收机制?

答案:OC2.0有Garbagecollection,但是iOS平台不提供。

一般我们了解的objective-c对于内存管理都是手动操作的,但是也有自动释放池。

但是差了大部分资料,貌似不要和arc机制搞混就好了。

求更多~~

50.NSOperationqueue

答案:存放NSOperation的集合类。

操作和操作队列,基本可以看成java中的线程和线程池的概念。用于处理ios多线程开发的问题。

网上部分资料提到一点是,虽然是queue,但是却并不是带有队列的概念,放入的操作并非是按照严格的先进现出。

这边又有个疑点是,对于队列来说,先进先出的概念是Afunc添加进队列,Bfunc紧跟着也进入队列,Afunc先执行这个是必然的,

但是Bfunc是等Afunc完全操作完以后,B才开始启动并且执行,因此队列的概念离乱上有点违背了多线程处理这个概念。

但是转念一想其实可以参考银行的取票和叫号系统。

因此对于A比B先排队取票但是B率先执行完操作,我们亦然可以感性认为这还是一个队列。

瞬间觉得这个queue名字有点忽悠人了,还不如pool~

综合一点,我们知道他可以比较大的用处在于可以帮组多线程编程就好了。

51.Whatislazyloading

答案:懒汉模式,只在用到的时候才去初始化。

也可以理解成延时加载。

我觉得最好也最简单的一个列子就是tableView中图片的加载显示了。

一个延时载,避免内存过高,一个异步加载,避免线程堵塞。

52.Canweusetwotableviewcontrollersononeviewcontroller

是否在一个视图控制器中嵌入两个tableview控制器?

答案:一个视图控制只提供了一个View视图,理论上一个tableViewController也不能放吧,

只能说可以嵌入一个tableview视图。当然,题目本身也有歧义,如果不是我们定性思维认为的UIViewController,

而是宏观的表示视图控制者,那我们倒是可以把其看成一个视图控制者,它可以控制多个视图控制器,比如TabbarController

那样的感觉。

53.CanweuseonetableviewwithtwodifferentdatasourcesHowyouwillachievethis

一个tableView是否可以关联两个不同的数据源?你会怎么处理?

答案:首先我们从代码来看,数据源如何关联上的,其实是在数据源关联的代理方法里实现的。

因此,我觉得可以设置多个数据源啊,但是有个问题是,你这是想干嘛呢?想让列表如何显示,不同的数据源分区块显示?

THE END

Ateamofabout35employeeshadcometogetherforateambuildingevent.Theywereayoung,brightandenthusiasticteam.However,oneoftheirchiefproblemswasthefactthattheywouldn'tshareinformationorsolutionswitheachother,andtheteamleaderthoughttheyweretoofocusedonthemselvesandnotontheteam.Asaresult,shebroughtthemallintothecafeteria.Allofthetablesandchairshadbeenstoredaway,andfundecorationsandhundredsofdifferentcoloredballoonshadbeenplacedaroundtheroom.Inthecenteroftheroomwasabigboxofballoonsthathadn'tbeenblownupyet.Theteamleaderinstructedeverybodytopickaballoon,blowitup,andwritetheirnameonit,buttheyhadtobecarefulnottobursttheballoon.Althoughtheyweregivenasecondchanceiftheirfirstballoonpopped,theywereoutofthegamethesecondtimeround.Intheend,about30teammemberswrotetheirnameswithouttheirballoonspopping.Theywerethenaskedtoleavetheroomand,afterfiveminutes,theteamleaderbroughtthembackinandaskedthemtofindtheballoonwiththeirnameonitamongstthehundredsofotherballoonsintheroom.After15minutesofsearching,noonehadfoundtheirballoon,andtheteamweretoldthattheywerethengoingtomoveontothethirdroundoftheactivity.Inthisround,eachteammemberwasinstructedtofindanyballoonwithanameonitandthengivethatballoontothepersonwhosenamewasonit.Withintwominutes,everybodyhadtheirownballoon.Theteamleadersummarizedtheactivitythus:“Wearemuchmoreefficientwhenwearewillingtosharewitheachotherandmuchbetteratproblemsolvingwhenweareworkingtogether,notindividually”.Sometimes,membersofteamscreateobstaclesbyfocusingsolelyontheirownpursuitsandgoals.Everymemberoftheteamshouldaskthemselvesonaregularbasiswhattheyaredoingandwhattheycandofortheteam.1.Whatwasthepurposeofholdingthisteambuildingevent?

1.初中英语必考句型详解:It's+adj.+(forsb.)todosth.的句型1. 此句型表示“对于(某人)来说做某事……”,句中的it是形式主语,后面的不定式是真正的主语。 It's good for the children to exercise every day. 孩子们每天锻炼是有好处的。 It's every important to sleep eight hours every day. 每天八个小时的睡眠是很重要的。 http://www.21wh.com/content/id/13169.html
2.中考英语阅读理解专项测试题Boxerisbig,butthecrieslikeakitten(幼猫).Ifyouhearatinymeowandseethatitiscomingfromabig,strongcat,thenyouhavefoundBoxer! IFyouseeHIM: Pleasecall55-5555orbringhimtoourhouseat10CherryLane.Wewillgiveyouareward. 23.Whatisthepurposeofthematerialabove? http://www.360doc.com/document/22/0517/18/73819181_1031805595.shtml
3.14.MrKingworksinashopanddrivesacarforthemanager...14.Mr King works in a shop and drives a car for the manager.He drives carefully and can keep calm in time of danger.And he escaped from several accidents.The manager pays him more and the traffic policemen often speak highly of him.Mr Baker.one of hhttp://www.1010jiajiao.com/czyy/shiti_page_116366
4.forthepurposeof是什么意思,forthepurposeof翻译为:为了,因...for the purpose of是什么意思 for the purpose of基本解释 为了,因…起见;借以 网络释义 为了┄目的 for the purpose of的用法和例句提示:点击例句中的单词,就可以看到词义解释 Nia exists solelyforthepurposeofeducating americans to the truth about the u.s. economy and inflation . ...https://fy.tingclass.net/w/for_the_purpose_of
5.ForthepurposeofthisexercisesDESisSOME.Moreonthislat...海词词典,最权威的学习词典,为您提供For the purpose of this exercises DES is SOME. More on this later!的在线翻译,For the purpose of this exercises DES is SOME. More on this later!是什么意思,For the purpose of this exercises DES is SOME. More on this later!http://dict.cn/For%20the%20purpose%20of%20this%20exercises%20DES%20is%20SOME_2E%20More%20on%20this%20later!
6.ForthepurposeofassuringtotheCompanythequalityofth...For the purpose of assuring to the Company the quality of the goods required under this contract the manufacturer shall permit the duly authorized representative of the Company,at any time during normal working hours and on reasonable notice,to inspect any premises of the Manufacturer or any thired...http://m.zaixian-fanyi.com/fan_yi_14050999
7.个人陈述StatementofPurpose写作原则新浪教育Please state your purpose in applying for graduate study, your particular area of specialization within the major, your plans for future occupation or profession, and any additional information that may aid the selection committee in evaluating your preparation and your aptitude for graduate study at ...https://edu.sina.com.cn/a/2003-10-13/54570.html
8....jeansApairofjeansForthepurposeofReducedsuzanne5580If you have had were definitely just researching considering that trendy thinner skirts, the case religious beliefs a pair of jeans individuals, by your facial lines from Good quality Morals a pair of jeans for the purpose of most certainly for the reason that Monarchy slacks, you will have qu...http://blog.chinaunix.net/uid-27772392-id-3455982.html
9.一个英语问题forthepurposeof和forthesakeof的区别?for the purpose of和for the sake of 的区别? 扫码下载作业帮搜索答疑一搜即得 答案解析 查看更多优质解析 解答一 举报 for the purpose of 为了,因…起见1.join for the purpose of communication.为了通讯的目的而连在一起.2.rewording for the purpose of clarification.为澄清而进行的解释.3.Of or for ...https://qb.zuoyebang.com/xfe-question/question/bf4254bd5e51fe4c80bc0a480c525a5c.html
10.为了;因..起见,forthepurposeof;fortheintentionof,音标...2) for the sake of 为了……起见3) for the love of 为了¥起见4) To Be on the Safe Side 为了保险起见 例句>> 5) for safety('s) sake 为了安全起见 例句>> 6) for the sake of convenient reference 为了参考方便起见补充资料:为了 1.表目的。 2.表原因。 说明:补充资料仅用于学习...http://www.dictall.com/indu53/82/5382256C5DB.htm
1.高考英语作文介词短语10、The government decided to provide financial support in favor of small and medium-sized enterprises.(政府决定提供财政支持,支持中小企业。) 在高考英语作文中,使用介词短语可以使文章更加生动、地道,同时也可以提高作文的表达水平,同学们可以通过阅读优秀范文,积累常用的介词短语,并在自己的写作中加以运用,希望...http://jy.jdzol.com/i9t976/8g0b42qb.html
2.英语二小作文[书信格式]写作指南,百搭高分句式!如何备考MBAPara 1: 表明写作意图,说明这封信想问什么方面的信息。 Para 2: 就某一具体问题询问。 Para 3: 提供个人联系方式,表达感谢,期盼回复。 常用句式: 1. I am writing this letter for the purposeof inquiring about some necessary information regarding… 2. I am writing this letter in hope of yourassis...https://www.hzmba.com/article/yingyuerxiaozuowen-shuxingeshi.html
3.英文原版电影经典台词6篇(全文)如果你不违背我,你要什么我就能给你什么,你要什么都可以.把你的心交给我吧. 4.whatthepurposeofuniversityistofindasuitablehusband. 读大学的目的是找一个好丈夫.(好像有些片面,但比较真实) 5.remember,theylovemoney,sojustpretendlikeyouownagoldmineandyou’reintheclub. ...https://www.99xueshu.com/w/file6h1tysa1.html
4.计算机英语翻译100句4.The purpose of storage hardware is to provide a means of storing computer instructions and data in a form that is relatively permanent,that is,the data is not lost when the power is turned off and easy to retrieve when needed for processing. ...https://blog.csdn.net/weixin_30399155/article/details/99937770
5.实用旅游英语短句海关:whatisthepurposeofyourvisit? 你:travel.(如果是探亲,就是I'mvisitingmyrelatives.) 海关:Howlongareyouplanningtostay? 你:Twoweeks. 海关:Wherewillyoubestaying? 你:I'llbestayingatahotel。 5.从目的地返回时过安检(托运那块和开始是一样的) ...https://www.cnfla.com/yingyu/537083.html
6.for(the)purposeof是什么意思及反义词沪江词库精选for (the) purpose of是什么意思、英语单词推荐 为了相似短语 of purpose adv.有意地 for the purpose of 为了,因.起见 to the purpose 中肯的,合适的,得其要领的 on purpose ad. 1.并非偶然地,故意地 2.特地,特有的目的 to no purpose 无目的地,无益地 for (the) purpose of ...https://www.hujiang.com/ciku/for_(the)_purpose_of/
7.英语的教师节祝福语35、Thankyouformakinglearningnotadullthingbutagreatjoy. 感谢您使我们把枯燥的学习变成了巨大的乐趣。 36、Thissmallgiftisonlyatinytokenofourgratefulness、Weallwanttothankyou. 这件小小的礼物略表我们的感激之情。我们大家都很感谢您。 37、Theprimarypurposeofeducationisnottoteachyoutoearnyourbread,buttomakeever...https://www.wenshubang.com/zhufuyu/500333.html
8.TheProjectGutenbergeBookofRightUseofLimeInSoil...and the boiling continued for a minute for the purpose of driving off the carbonic acid gas, which is liberated first. The boiling is continued and a piece of moistened paper, previously impregnated with lead acetate, is placed over the mouth of the flask. If the soil contains acid, a che...https://www.gutenberg.org/files/25389/25389-h/25389-h.htm
9.forthepurposeof大量翻译例句关于"for the purpose of" – 英中词典以及8百万条中文译文例句搜索。https://cn.linguee.com/%E8%8B%B1%E8%AF%AD-%E4%B8%AD%E6%96%87/%E7%BF%BB%E8%AD%AF/for+the+purpose+of.html