首页 > 其他 > 详细

ios软件工程面试题(2)

时间:2014-02-18 16:07:49      阅读:369      评论:0      收藏:0      [点我收藏+]

1.strong,weak关键字的作用和区别?实例说明。

strong关键字与retain关似,用了它,引用计数自动+1。

(weak和strong)不同的是 当一个对象不再有strong类型的指针指向它的时候 它会被释放  ,即使还有weak型指针指向它。

想象我们的对象是一条狗,狗想要跑掉(被释放)。

strong型指针就像是栓住的狗。只要你用牵绳挂住狗,狗就不会跑掉。如果有5个人牵着一条狗(5个strong型指针指向1个对象),除非5个牵绳都脱落 ,否着狗是不会跑掉的。

weak型指针就像是一个小孩指着狗喊到:“看!一只狗在那” 只要狗一直被栓着,小孩就能看到狗,(weak指针)会一直指向它。只要狗的牵绳脱落,狗就会跑掉,不管有多少小孩在看着它。

只要最后一个strong型指针不再指向对象,那么对象就会被释放,同时所有的weak型指针都将会被清除。


2.NSnotificationCenter 和Delegate 都是什么?在项目中如何选择呢 ?

两者的基本共同点:传递消息,做些什么。

 一、Delegate委托(一对一之间) 代理委托是1v1的。

   在解释委托之前,先提下回调。

   事件机制是典型的回调案例。

   为什么要使用回调机制?因为可以把调用者与被调用者分开。调用者不关心谁是被调用者,所有它需知道的,只是存在一个具有某种特定原型、某些限制条件(如返回值为int)的被调用函数。

   在Object-C中,机制相同,但实现手段不一样。采用协议的机制,定义一些在某些特定条件下调用的接口。因此在OC中更多地提到的是委托。

   应用案例:AView中声明一个协议AViewDelegate,其中声明了一些方法。然后在AView中声明一个AViewDelegate类型的属性delegate(委托),AViewController实现了AViewDelegate协议中的方法,那么这个Controller就可以作为AView的委托delegate来执行某些特定的操作。

   回调和委托?我的个人观点,回调只是一种我们需要调用的功能,用委托的方式来实现了回调。在OC编程中,很多声明的协议的命名,都以Delegate(委托)来命名,从字面上的简单理解,实现某个View的协议的类,可以作为这个View的委托,待其做某些行为。也就是说委托是存在于两者之间的,分为委托人和受托人,也就是说由受托人来帮委托人做些事情。个人感觉回调和委托在OC里面共同来谈的话有点混淆,感觉从委托的这个概念来应用理解协议这块技术使用更容易些。

 

二、NSNotificationCenter(通知中心,多对多)N v N的

  理解通知中心的概念。每个运行中的application都有一个NSNotificationCenter的成员变量,它的功能类似公告栏。举例:对象注册关注某个确定的notification(如果有人捡到一只小狗,就去告诉我),我们把这些注册对象叫做observer,其它的一些对象会给center发送notification(我捡到了一只小狗)。Center将notifications转发给所有注册该notification感兴趣的对象。我们把这些发送notification的对象叫做poster。

 

1、获取通知中心的方法。

   NSNotificationCenter*ncc = [NSNotificationCenterdefaultCenter];

2、在中心注册消息接受者的方法。

- (void)addObserver: (id)anObserver  selector:@selector(methodX)  

name:(NSString*)notificationName

object:  (id) posterOb;

   第一个参数为需要收听消息的对象;第二个参数为接受对象收到消息后触发的方法;第三个参数相当于要收听的消息的“标题”;

第四个参数为消息的发送者。

   此处需注意两点:

   第一点,如果notificationName参数为nil,那么通知中心会将发送者的所有notification发给接收者。

   第二点,如果posterOb参数为nil,那么通知中心将所有“标题”为notificationName的notification发给接收者。

3、发送消息至中心的方法。

   - (void) postNotificationName:(NSString *)notificationName

object:(id)anObject;


 

-(void) postNotificationName:(NSString *)notificationName

object:(id)anObject

userInfo:(NSDictionary *) info;

注:userInfo参数可使消息中传递更多的信息。

4、移除收听者的方法。

 (void)removeObserver:(id)observer

注意:每位收听者需在其相应的dealloc方法中将自己从通知中心中移除。


3.使用UITableViewCell时候,需要对cell进行重用,现在有三种不同类型的自定义cellA,cellB,cellC,如何保证table拖动时候不会出现不同的cell的控件发生重叠的情况?

如何实现 cell的重用?

主要是通过 UITableView的 “dequeueReusableCellWithIdentifier” 函数来实现,从字面上理解是“出列的可重用的cell”,其实简单说就是一个cell池,里面放的就是你之前创建过的cell。

注意点:

1,重取出来的cell是有可能已经捆绑过数据或者加过子视图的,如果有必要,要清除需要用与显示的数据和remove掉add过的子视图(使用 tag—viewWithTag 获取相关视图对象)。

2,原理就是为了避免频繁的 alloc和delloc cell对象。

3,设计的关键是实现cell和数据的完全分离。

介绍:一个屏幕显示的cell数量是有限的,当屏幕滚动时候,就会调用方法获取新的cell,而老的cell会在屏幕外面就不显示了。reuse机制就是这样,当cell需要显示的时候,从queue里面找,找到了,设置一下内容,显示出来。滚动界面当有cell被移出屏幕时,把这个cell丢到queue里面,显示新的cell时,如果有“相同类型”(identifier)的cell,就从队列拿一个出来,设置数据,显示出来,至于queue里面会有多少cell,这个会自动控制。


4.请写出代码创建一个UIButton,点击触发 showLogin方法。


UIButton *button = [UIButton alloc]init];

[button addTarget:self action:@selector(showLogin:) forControlEvents:UIControlTouchupInside];

    UIButton *button = [[UIButton alloc]init];

    [button addTarget:self action:@selector(showLogin:) forControlEvents:UIControlEventTouchUpInside];

5.简单写一下你知道的创建多线程的方式,越多越好


1)使用NSThread创建多线程。  detach:分离;派遣;使超然;

i:[NSThread detachNewThreadSelector:@selector(selector) toTarget:self withObject:something];  //类方法

 

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

[myThread start]; //实例方法


2)NSInvocationOperation对象

NSInvocationOpreation *opreation = [NSInvocationOpreation alloc]initwithTarget:self selector: @selector(dosmeThing:) object: something];


[dequeue  addOpreation: opreation];


3)GCD


disapatch_async(),^{


};

ios软件工程面试题(2)

原文:http://blog.csdn.net/ministarler/article/details/19402771

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!