笔试笔试!!笔试笔试!!

来源:互联网 发布:哪个软件看泰剧最多 编辑:程序博客网 时间:2024/04/25 07:23

四面八方的转载


浅复制与深复制的区别?

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

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


类别的作用?

可以在不获悉,不改变原来代码的情况下往里面添加新的方法,只能添加,不能删除。并且如果类别和原来类中的方法产生名称冲突,类别将覆盖原来的方法,类别具有更高优先级。

类别的主要3个作用

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

2)创建对私有方法的前向引用(参考http://book.51cto.com/art/200907/138052.htm)

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

继承可以增加修改方法,并且可以增加属性


类别和扩展的区别?

分类和扩展的区别不同在于后者可以添加属性。另外后者添加的方法是必须实现的,扩展可以认为是一个私有的分类


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

OBJ中的协议有2个层面:正式与非正式。正式是属于设计模式考虑的范畴,不是必须实现的,如果有实现,就会改变类的属性。非正式协议就是类别的另一种表达方式


KVO与KVC

kvo:键值观察机制,提供了观察某一属性变化的方法。

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


kvo,举一个button的例子

[self addObserver:self forKeyPath:@"highlighted" options:0 context:nil];

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context 


{ 
 

if ([keyPath isEqualToString:@"highlighted"] ) 

{ 
 [self setNeedsDisplay]; 
 } 


}

系统根据keyPath去取的相应地值发生变化,理论上和kvc机制是一个道理。

kvc如何通过key找到value,当通过kvc调用对象时,比如:[self valueForKey:@"someKey"]时,程序会自动试图通过几种不同的方式来解析这个调用


代理的作用?

代理的目的是改变或者传递控制链

允许一类在某些特定时刻通知其他类,而不需要获取得到那些类的指针。减少框架复杂度(低耦合高内聚)


obc是动态运行时语言是什么意思?

数据类型的确定是由编译时,推迟到运行时。运行时机制使我们直到运行时才去决定一个对象的类别,以及调用该类别对象指针方法。


关于多态性?

不同的对象以自己的方式响应相同消息的能力叫做多态。


通知和协议不同之处?

协议有控制链(has-a)的关系,翻译为单一拥有和可控制的对应关系,协议将俩个关系很远的类联系起来,可以receive把结果返回给sender。

通知的话,可以一对多,一条消息可以发送给多个消息接受者。它只关心发出通知,不管多少接收到感兴趣要处理


说说响应链?



frame与bounds有什么区别?

frame是相对于父view的位置

bounds是相对于系统view的位置


method和selector有何不同?

selector是一个方法的名字,method是一个组合,包含名字和实现


什么是懒汉模式?

懒汉模式,只有用到的时候采取初始化,可以理解为延迟加载

如tableView

tableView显示很多条目,有时候需要显示图片,但一次从服务器上取来所有图片对用户来说是浪费流量,对服务器来说也是负担,最好是按需加载,即当用户要浏览该条目时,在去加载它的图片。

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
    UIImage *image = [self getImageForCellAtIndexPath:indexPath];  //从网上取得图片
    [cell.imageView setImage:image];
}

这个虽然解决了延迟加载的问题,但当网上较慢,或者图片很大时,你会发现程序可能会失去对用户的响应。

因为UIImage *image = [self getImageForCellAtIndexPath:indexPath]; 这个方法可能需要花费大量的时间,主要处理这个方法。所以会失去对用户的响应。

所以将该方法提取出来,再开一个线程去做这件事情。

- (void)updateImageForCellAtIndexPath:(NSIndexPath *)indexPath
{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    UIImage *image = [self getImageForCellAtIndexPath:indexPath];
    UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];
    [cell.imageView performSelectorOnMainThread:@selector(setImage:) withObject:image waitUntilDone:NO];
    [pool release];
}
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
    [NSThread detachNewThreadSelector:@selector(updateImageForCellAtIndexPath:) toTarget:self withObject:indexPath];
}

oc可以多重继承么?可以实现多个接口么?重写一个类的方式用来继承好还是分类好?为什么?

不能,可以,分类

什么是推送?

是一种技术,客户端获取资源的一种手段,一般情况下,是客户端主动去pull,推送的话是服务器主动push

单例?

系统只有一个该类对象,并且保证只有统一访问接口









0 0