IOS面试题详解(二)

转载 2012年03月29日 11:16:38

下面从第一题开始解答:

题目:1.Object-c的类可以多重继承么?可以实现多个接口么?Category是什么?重写一个类的方式用继承好还是分类好?为什么?

关于多继承:

首先 object-c不能够多继承,类似下面代码的这种方式是绝对通不过编译的.当然,你也可以把NSString前面的":"去掉再试试,呵呵!

error

那么有没有别的方式来替代呢?有,一种我们称之为伪继承,另一种我们可以通过ios中无处不在的@protocol委托方式来实现.

1.伪继承

     尽管再objtive-C中不提供多继承,但它提供了另外一种解决方案,使对象可以响应在其它类中实现的消息(别的语言中,一般叫方法,两者无差别). 这种解决方案叫做消息转发,它可以使一个类响应另外一个类中实现的消息。

     在一般情况下,发送一个无法识别的消息会产生一个运行时的错误,导致应用程序崩溃,但是注意,在崩溃之前,iphone运行时对象为每个对象提供了第二次机会来处理消息。捕捉到一条消息后可以把它重定向到可以响应该消息的对象。

     这个功能完全通过消息转发来实现,发送消息给一个无法处理该选择器的对象时,这个选择器就会被转发给 forwardInvocation 方法.接收这条消息的对象,用一个NSInvocation的实例保存原始的选择器和被请求的参数.所以,我们可以覆盖 forwardInvocation 方法,并把消息转发给另外一个对象.

1.1 实现消息转发功能

   在给程序添加消息转发功能以前,必须覆盖两个方法,即methodSignatureForSelector: 和 forwardInvocation:。methodSignatureForSelector:的作用在于为另一个类实现的消息创建一个有效的方法签名。forwardInvocation:将选择器转发给一个真正实现了该消息的对象.

例子:

1.

1 - (NSMethodSignature*)methodSignatureForSelector:(SEL)selector
2 {
3     NSMethodSignature* signature = [super methodSignatureForSelector:selector];
4     
5     if (!signature)
6         signature = [self.carInfo methodSignatureForSelector:selector];
7     
8     return signature;
9 }

2.

1 - (void)forwardInvocation:(NSInvocation *)invocation
2 {
3     SEL selector = [invocation selector];
4     
5     if ([self.carInfo respondsToSelector:selector])
6     {
7         [invocation invokeWithTarget:self.carInfo];
8     }
9 }



 3.调用

1 Car *myCar = [Car car]; //Car为一个类
2 [(NSString *)myCar UTF8String]  //这里调用NSString中的UTF8String方,注意Car中并未实现该方法

 

解释: 这里借iphone开发秘籍的例子来说明, self.carInfo是一个只读的NSString对象,存在于Car类中.例子中Car实例是无法正确的为另外一个对象(NSString)实现的选择器创建一个有效的签名。运行时当检查到当前没有有效的签名,即进入该对象(这里是myCar)的methodSignatureForSelector:方法中,此时,将在这个方法中对每个伪继承进行迭代并尝试构建一个有效的方法签名的机会.例如代码中,当myCar调用UTF8String时,由于无法从当前对象中获得消息,转入第二次机会捕捉消息,首先进入methodSignatureForSelector:方法,采用迭代的方式为当前被调用的方法创建一个有效的签名,得到签名后,转入forwardInvocation:方法对其调用的方法(UTF8String)进行实现.  forwardInvocation:中,首先获得调用的方法(UTF8String),判断self.carInfo(一个nsstring对象)能否响应该方法,如果可以,将调用UTF8String对象的目标转换为self.carInfo对象. 这样 ,我们就实现了多继承,呵呵!!

注:如果您仍有疑问,可访问苹果的官方文档查询消息转发相关内容:
地址 http://www.apple.com.cn/developer/mac/library/documentation/Cocoa/Conceptual/ObjCRuntimeGuide/Articles/chapter_6_section_1.html#//
    apple_ref/doc/uid/TP40008048-CH105-SW1

2.委托

在IOS中委托通过一种@protocol的方式实现,所以又称为协议.协议是多个类共享的一个方法列表,在协议中所列出的方法没有响应的实现,由其它人来实现.这叫好比我想买个手机,所以我有个buyIphone 方法,但是我不知道谁那买手机,所以把这个需求发布出去(比如公布在网站上),如果有卖手机的商人(也就是说他能实现buyIphone这个方法)看到,他就会接受我的委托,(在商人自己的类中实现<XXXdelegate>),那么我的委托对象就指向了这个商人..当我要买手机的时候,直接找他就行了.

例如:

@protocol MyDelegate
-(void)buyIphone:(NSString *)iphoneType money:(NSString *)money;

@end
@interface My : NSObject
{
    id<MyDelegate> deleage;
}
@property(assign,nonatomic)id<MyDelegate> delegate;
@end

代码中声明了一个协议 名叫Mydelegate,在其中有一个buyIphone方法,即一个委托项。当我要购买手机的时候只需要通过delegate 调用 BuyIphone方法即可.

如下:

-(void)willbuy
{
    [delegate buyIphone:@"iphone 4s" money:@"4888"];

}

我不必关心谁现实了这一委托,只要实现了这个委托的类,并且buyIphone是声明的委托中必须实现的方法,那么就一定能够得到结果.

例如:商人类实现了这一委托(用<Mydelegate>表示实现)

#import <Foundation/Foundation.h>
#import "My.h"
@interface Business : NSObject<MyDelegate>

@end

然后在 @implementation Business 中调用 buyIphone方法

#import "Business.h"

@implementation Business

-(void)buyIphone:(NSString *)iphoneType money:(NSString *)money
{
    NSLog(@"手机有货,这个价钱卖你了,发货中!!");
}
@end

就ok啦。这样是不是也模拟了多继承呢?通过委托,其实你也就摆脱了去考虑多继承方面的事情,从而关注当前类。


芒果iOS开发之高级面试题二

索引 25. _objc_msgForward 函数是做什么的,直接调用它将会发生什么?26. runtime如何实现weak变量的自动置nil?27. 能否向编译后得到的类中增加实例变量?能否...
  • CrazyZhang1990
  • CrazyZhang1990
  • 2015年12月25日 22:53
  • 2381

IOS面试题详解(二)..

下面从第一题开始解答: 题目:1.Object-c的类可以多重继承么?可以实现多个接口么?Category是什么?重写一个类的方式用继承好还是分类好?为什么? 关于多继承: 首先 objec...
  • tianyaxingge
  • tianyaxingge
  • 2012年08月28日 12:25
  • 1132

ios面试题详解-二

目前形势,参加到iOS队伍的人是越来越多,甚至已经到供过于求了。今年,找过工作人可能会更深刻地体会到今年的就业形势不容乐观,加之,培训机构一火车地向用人单位输送iOS开发人员,打破了生态圈的动态平衡。...
  • mazegong
  • mazegong
  • 2017年11月14日 17:17
  • 49

ETL架构师面试题(二)

架构 四.在ETL过程中四个基本的过程分别是什么?        Kimball数据仓库构建方法中,ETL的过程和传统的实现方法有一些不同,主要分为四个阶段,分别是抽取(extract)、清洗(cle...
  • leicool_518
  • leicool_518
  • 2015年04月27日 17:46
  • 462

【2017年最新】 iOS面试题及答案

设计模式是什么? 你知道哪些设计模式,并简要叙述? 设计模式是一种编码经验,就是用比较成熟的逻辑去处理某一种类型的事情。 1). MVC模式:Model View Control,把模型 视图 控制器...
  • tfy_2425482491
  • tfy_2425482491
  • 2017年07月17日 09:13
  • 4003

iOS进阶面试题----经典10道

OneV‘s Den在博客里出了10道iOS面试题,用他的话是:"列出了十个应聘Leader级别的高级Cocoa/CocoaTouch开发工程师所应该掌握和理解的技术" 。  在这里給一份我的答案。 ...
  • xunyn
  • xunyn
  • 2013年12月10日 21:45
  • 98081

iOS进阶面试题----多线程

1 多线程是什么  多线程是个复杂的概念,按字面意思是同步完成多项任务,提高了资源的使用效率,从硬件、操作系统、应用软件不同的角度去看,多线程被赋予不同的内涵,对于硬件,现在市面上多数的CPU都是多核...
  • xunyn
  • xunyn
  • 2013年11月08日 17:49
  • 56186

【面试】iOS 开发面试题(三)

1、iOS数据持久化存储方案有哪些? 参考答案: plist属性列表存储(如NSUserDefaults)文件存储(如二进制数据写入文件存储,通过NSFileManager来操作将下载起来的二进制数...
  • chen_gp_x
  • chen_gp_x
  • 2016年03月02日 22:29
  • 18131

《TCP/IP详解卷2:实现》笔记--TCP的输入

当收到的数据报的协议字段指明这是一个TCP报文段时,ipintr(通过协议协议转换表中的pr_input函数)会调用tcp_input 进行处理,tcp_inut在软件中断一级执行。 函数非常长,我们...
  • TODD911
  • TODD911
  • 2015年01月06日 22:45
  • 1765

iOS 最全的面试题~[有答案]

联系人:石虎  QQ: 1224614774 昵称:嗡嘛呢叭咪哄 方便学习 iOS 的朋友,在面试的时候一面而就,拿到高薪,...
  • shihuboke
  • shihuboke
  • 2017年06月01日 15:33
  • 1797
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:IOS面试题详解(二)
举报原因:
原因补充:

(最多只允许输入30个字)