Centos系统下载大全 | Redhat系统下载大全 | Windows2012系统下载大全 | Windows2008系统下载大全| CMS教程 | 网站地图 51运维网-专注Linux/Unix系统安全运维!
当前位置:51运维网 > 编程 > Objective-C > 正文

Objective-C 教程

时间:2014-08-20 20:58 来源:未知 作者:www.51ou.com 阅读:

Objective-C 教程

Objective-C语言是一种通用的,面向对象的编程语言,Smalltalk风格消息传送到C编程语言。它是使用苹果OS X和iOS操作系统及彼等各自的API, Cocoa 和Cocoa Touch主要的编程语言。

本参考将带你通过简单实用的办法,而学习 Objective-C 编程语言。

读者

对于初学者来说这个参考是帮助他们了解基本的Objective-C编程语言相关的先进理念。

前提条件

在开始做这个参考的例子各类实践之前,我假设你已经知道什么是一种计算机程序,计算机编程语言是什么?

Objective-C程序编译/执行

对于大多数在本教程中给出的例子中均有调试过,可自行试试看 Objective-C 程序编译和执行。

Objective-C和C的区别

Objective-C是C语言的母集合,意指任何原始的C语言程式都可以通过Objective-C编译器而不需要修改,也允许Objective-C 使用任何原始的C语言代码。Objective-C形容自己是覆盖于C语言上的一层baosha,最主要得区别是Objective-C在原始的C语言主 题上加入面向对象的概念。
虽然Objective-C是的母集,但是它不视C得基本类型为第一级的对象,和C++不同,Objective-C只允许单继承。由于 Objective-C动态运行时类型,而且所有方法都是函数调用,很多性能优化方法都不能应用于Objective-C(例如,内联函数,交互式优化, 常量传递等),这使得Objective-C性能劣于类似得对象语言(C++)。
关于多继承的问题:
首先 object-c不能够多继承,那么有没有别的方式来替代呢?有,一种我们称之为伪继承,另一种我们可以通过ios中无处不在的@protocol委托方式来实现.
1.伪继承

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

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

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

1.1 实现消息转发功能

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

例子:

1、

- (NSMethodSignature*)methodSignatureForSelector:(SEL)selector

{

NSMethodSignature* signature = [super methodSignatureForSelector:selector];

if (!signature)

signature = [self.carInfo methodSignatureForSelector:selector]; 

return signature;

}

2.

- (void)forwardInvocation:(NSInvocation *)invocation

{

SEL selector = [invocation selector];

if ([self.carInfo respondsToSelector:selector])

{

[invocation invokeWithTarget:self.carInfo];

}

}

 3.调用

Car *myCar = [Car car]; //Car为一个类
 [(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这个方法)看到, 他就会接受我的委托,(在商人自己的类中实现),那么我的委托对象就指向了这个商人..当我要买手机的时候,直接 找他就行了.

例如:

@protocol MyDelegate

-(void)buyIphone:(NSString *)iphoneType money:(NSString *)money;



@end

@interface My : NSObject

{

    id deleage;

}

@property(assign,nonatomic)id delegate;

@end

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

如下:

-(void)willbuy

{

    [delegate buyIphone:@"iphone 4s" money:@"4888"];



}

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

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

#import 

#import "My.h"

@interface Business : NSObject



@end

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

#import "Business.h"



@implementation Business



-(void)buyIphone:(NSString *)iphoneType money:(NSString *)money

{

    NSLog(@"手机有货,这个价钱卖你了,发货中!!");

}

@end

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


 

感谢您对【51运维网 http://www.51ou.com/】的支持,我们为您免费提供《Objective-C 教程》技术文章,《Objective-C 教程》详细使用和说明,有时《Objective-C 教程》可能不完善、敬请谅解!如果《Objective-C 教程》有错误请给我们留言,我们将尽快修复文章错误,如果您觉得本站不错,请分享给周围的朋友!谢谢!

顶一下
(0)
0%
踩一下
(0)
0%
上一篇:没有了
下一篇:Objective-C 语言概述
推荐内容
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
验证码:点击我更换图片