没有合适的资源?快使用搜索试试~ 我知道了~
首页C++开发者转战Objective-C:从C++到iOS编程入门指南
C++开发者转战Objective-C:从C++到iOS编程入门指南
需积分: 12 0 下载量 93 浏览量
更新于2024-07-24
1
收藏 901KB PDF 举报
"《从C++到Objective-C》是一系列针对iOS开发者的文章,旨在帮助那些已经熟悉C++的程序员更好地理解和掌握Objective-C。作者认为,由于Objective-C与C++有相似之处,特别是都具有面向对象的特性,通过C++作为切入点学习Objective-C更为合适。该系列文章并非详尽的手册,而是侧重于通过对比C++来讲解Objective-C的高级概念,例如类的实现、动态机制等。 文章首先提到了Smalltalk,它是面向对象编程的先驱,Objective-C正是在此基础上发展起来的。Objective-C的目标是在C语言的基础上添加面向对象特性,从而克服C语言的局限性。虽然C++是更广为人知的选择,但Objective-C更接近Smalltalk的动态性和灵活性。Objective-C 2.0是该系列文章的基础,强调的是语言本身以及它在Mac OS X开发中的应用,即Cocoa框架。 Cocoa是一个类库,它为Objective-C提供了丰富的工具和API,使得开发人员能够构建高效、现代的Mac应用程序。类比于C++与Qt、Java与Spring的关系,Cocoa和Objective-C构成了开发平台的核心组件。学习者可以通过这一系列文章,不仅了解Objective-C语言,还能掌握如何利用Cocoa库进行实际的iOS开发,提升编程技能和效率。 这个系列文章适合C++开发者转型至iOS开发,或者想要深入了解Objective-C与C++差异的读者。通过对比学习,读者可以更好地理解Objective-C的面向对象特性和设计哲学,为后续深入iOS开发打下坚实基础。"
资源详情
资源推荐
}
-(int) g:(int) x;
-(int) g:(float) x; //
错误!类型不同不作为重载依据,同上一个没有区别
-(int) g:(int) x :(int) y; //
正确:两个匿名
label
-(int) g:(int) x :(float) y; //
错误:同上一个没有区别
-(int) g:(int) x andY:(int) y; //
正确:第二个
label
是
“andY”
-(int) g:(int) x andY:(float) y; //
错误:同上一个没有区别
-(int) g:(int) x andAlsoY:(int) y; //
正确:第二个
label
是
“andAlsoY”
@end
基于 label 的重载可以很明白地解释方法的名字,例如:
@interface Foo : NSObject {}
//
方法名是
“g”
-(int) g;
//
方法名是
“g:”
-(int) g:(float) x;
//
方法名是
“g::”
-(int) g:(float) x :(float) y;
//
方法名是
“g:andY:”
-(int) g:(float) x andY:(float) y;
//
方法名是
“g:andZ:”
-(int) g:(float) x andZ:(float) z;
@end
显然,Objective-C 的方法使用 label 区分,而不是类型。利用这种机制,我们就可以使用选择器 selector 来指定一个
方法,而不是“成员函数指针”。
从 C++ 到 Objective-C(5):类和对象(续二)
作者: DevBean 日期: 2011 年 03 月 20 日发表评论 (2)查看评论
成员函数的指针:选择器
在 Objective-C 中,
方法
具有包含了括号和标签的特殊语法。普通的
函数
不能使用这种语法。在 Objective-C 和 C 语言
中,函数指针具有相同的概念,但是对于成员函数指针则有所不同。
在 C++ 中,尽管语法很怪异,但确实兼容 C 语言的:成员函数指针也是基于类型的。
C++
class Foo
{
public:
int f(float x) {...}
};
Foo bar
int (Foo::*p_f)(float) = &Foo::f; // Foo::f 函数指针
(bar.*p_f)(1.2345); // 等价于 bar.f(1.2345);
在 Objective-C 中,引入了一个新的类型:指向成员函数的指针被称为选择器 selector。它的类型是 SEL,值通过
@selector 获得。@selector 接受方法名(包括 label)。使用类 NSInvocation 则可以通过选择器调用方法。大多时候,
工具方法族 performSelector: (继承自 NSObject)更方便,约束也更大一些。其中最简单的三个是:
-(id) performSelector:(SEL)aSelector;
-(id) performSelector:(SEL)aSelector withObject:(id)anObjectAsParameter;
-(id) performSelector:(SEL)aSelector withObject:(id)anObjectAsParameter
withObject:(id)anotherObjectAsParameter;
这些方法的返回值同被调用的函数的返回值是一样的。对于那些参数不是对象的方法,应该使用该类型的包装类,如
NSNumber 等。NSInvocation 也有类似的功能,并且更为强大。
按照前面的说法,我们没有任何办法阻止在一个对象上面调用方法,即便该对象并没有实现这个方法。事实上,当消息
被接收到之后,方法会被立即触发。但是,如果对象并不知道这个方法,一个可被捕获的异常将被抛除,应用程序并不
会被终止。我们可以使用 respondsToSelector: 方法来检查对象是否可被触发方法。
最后,@selector 的值是在编译器决定的,因此它并不会减慢程序的运行效率。
Objective-C
@interface Slave : NSObject {}
-(void) readDocumentation:(Document*)document;
@end
//
假设
array[]
是包含
10
个
Slave
对象的数组,
// document
是一个
Document
指针
//
正常的方法调用是
for(i=0 ; i<10 ; ++i)
[array[i] readDocumentation:document];
//
下面使用
performSelector:
示例:
for(i=0 ; i<10 ; ++i)
[array[i] performSelector:@selector(readDocumentation:)
withObject:document];
//
选择器的类型是
SEL
//
下面代码并不比前面的高效,因为
@selector()
是在编译器计算的
SEL methodSelector = @selector(readDocumentation:);
for(i=0 ; i<10 ; ++i)
[slaves[i] performSelector:methodSelector withObject:document];
//
对于一个对象
“foo”
,它的类型是未知的(
id
)
剩余47页未读,继续阅读
煽情泪
- 粉丝: 1
- 资源: 5
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 最优条件下三次B样条小波边缘检测算子研究
- 深入解析:wav文件格式结构
- JIRA系统配置指南:代理与SSL设置
- 入门必备:电阻电容识别全解析
- U盘制作启动盘:详细教程解决无光驱装系统难题
- Eclipse快捷键大全:提升开发效率的必备秘籍
- C++ Primer Plus中文版:深入学习C++编程必备
- Eclipse常用快捷键汇总与操作指南
- JavaScript作用域解析与面向对象基础
- 软通动力Java笔试题解析
- 自定义标签配置与使用指南
- Android Intent深度解析:组件通信与广播机制
- 增强MyEclipse代码提示功能设置教程
- x86下VMware环境中Openwrt编译与LuCI集成指南
- S3C2440A嵌入式终端电源管理系统设计探讨
- Intel DTCP-IP技术在数字家庭中的内容保护
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功