object-C 与 C++的比较
- 目前好象只有Apple使用Objective-C作为其支持的语言吧。
- 与C++的不同之处有:
- O-C中所有的类都必须继承自NSObject。
- O-C中所有对象都是指针的形式。
- O-C用self代替this。
- O-C使用id代替void*。
- O-C使用nil表示NULL
- O-Ck只支持单继承。
- O-C使用YES/NO表示TRUE/FALSE
- O-C使用#import代替#include
- O-C中用消息表示类的方法,并采用[aInstance method:argv]调用形式。
- O-C支持反射机制
- O-C支持Dynamic Typing, Dynamic Binding和Dynamic Loading。
- 与C++的相同之处有:
- 与C共享的部分一致。
- 可以使用assert(BOOL), 一般用NSCParameterAssert(BOOL)代替。
- O-C中的命名前缀说明:
- NS-:NextStep
- CF-:Core Foundation
- CA-:Core Animation
- CG-:Core Graphics
- UI-:User Interface
- O-C中的消息特殊性:
- 调用消息的类可以不知道如何响应这个消息。如果它不知道如何处理这个消息,它会自动的将这个消息转给其他的类,比如它的父类。
- 调用消息的类可以是nil。在C++中,在使用类方法之前,我们都需要检查对象是否为空,所以在实现析构函数的时候,常会有如下的代码,如if (var) { delete var; } 但是在objective c中,我们就可以直接写[var release]; 即使var == nil, 也不会有问题。
- O-C中的函数声明格式有:
- -/+ (return type) function_name;
- -/+ (return type) function_name : (parameter type) parameter;
- -/+ (return type) function_name : (parameter type) parameter1 otherParameter : (parameter_type) parameter2
- 以上参数说明:-表示一般函数,+表示静态函数。otherParameter是参数的别名(第一个参数的别名省略),在函数调用时方便指定。
- O-C中的构造/析构函数
- O-C中的init()/release()对应于C++的构造/析构函数。alloc()/dealloc()也就对应于C++的new和delete,其中的dealloc()由于引用计数的自动调用而不用手动调用。
- O-C中父类的init()/release()函数需要子类的手动调用。而且每次都必须调用。不同于C++的自动调用。
- 构造函数(- (id) init)调用形如:CSample* pSample=[CSample alloc] init];其中alloc(+ (id) alloc)是继承来的static函数,init是继承来的一般函数,如重写一般函数时,则相当于C++的覆盖(不带参数)或重载(带参数)。
- 析构函数(- (void) release)将引用计数减1,当=0时父类的release()会自动调用dealloc(- (void) dealloc);
- 当O-C没有数据成员时,可省略{},建议保留。
- 继承下来的方法,如:-(id) init可以头文件中省略,建议保留
- 0-C中只有数据成员的访问限制,没有方法的访问限制。
- 同C++一样,数据成员有三种访问限制public, protected, private,缺省是protected。
- 示例:@interface AccessExample: NSObject {
@public
int publicVar;
@protected
int protectedVar;
@private
int privateVar;
}
@end - 方法的访问限制可通过Category实现
- 示例:
@interface MyClass
- (void) sayHello {
NSLog(@"Hello");}
@end
@interface MyClass(Private)
- (void) kissGoodbye;
@end
- O-C中没有类的静态变量,只有全局变量
- O-C中的数组NSArray可以保存不同类型的数据。
- O-C也支持run-time时的类类型检查
- - (BOOL) isKindOfClass: classObj
用于判断该对象是否属于某个类或者它的子类 - - (BOOL) isMemberOfClass: classObj
用于判断该对象是否属于某个类(这里不包括子类) - - (BOOL) respondsToSelector: selector
用于判断该对象是否能响应某个消息。这里,我们可以将@selector后面带的参数理解为C++中的函数指针。
注意:1)不要忘了@ 2)@selector后面用的是(),而不是[]。3)要在消息名称后面跟:,无论这个消息是否带参数。如:[pSquare respondsToSelector:@selector(Set: andHeight:)]。 - + (BOOL) instancesRespondToSelector: selector
用于判断该类是否能响应某个消息。这是一个静态函数。 - -(id) performSelector: selector :调用对象的selector方法。
- conformsToProtocol 类似于respondsToSelector ,用于动态检查某个对象是否遵守某个协议。
- - (BOOL) isKindOfClass: classObj
- Category:在没有源代码的情况下,为一个已经存在的类添加一些新的功能
- 只能添加新的方法,不能添加新的数据成员
- Category 的名字必须是唯一的
- Protocol:相当于C++中的纯虚类
- 形如:@interface MyDate: NSObject <Printing> { } @end
- 使用:MyDate * dat = [[MyDate alloc] init]; id<Printing> var = dat; [var print]。
- 说明:我们首先声明了Printing 协议,任何遵守这个协议的类,都必须实现print 方法。在Objective C 中,我们通过<>来表示遵守某个协议。当某个类声明要遵守某个协议之后,它就必须在.m文件中实现这个协议中的所有方法。使用id<Printing> 作为类型,而不是象C++中的Printing* var。
- IBOutlet, IBAction: 这两个东西其实在语法中没有太大的作用。如果你希望在Interface Builder中能看到这个控件对象,那么在定义的时候前面加上IBOutlet,在IB里就能看到这个对象的outlet,如果你希望在Interface Builder里控制某个对象执行某些动作,就在方法前面加上(IBAction)。
- 尽量避免在一行语句中进行两层以上的嵌套
- 消息转发:- (void) forwardInvocation: (NSInvocation*)anInvocation;
转载于:https://www.cnblogs.com/zsw-1993/archive/2013/03/27/4880266.html
object-C 与 C++的比较相关推荐
- 在kotlin companion object中读取Bean,注入Bean对象
在kotlin companion object中读取Bean,注入Bean对象 在使用kotlin时,或多或少地会使用到一些公共组件,如 http. mongo. redis相关的组件. 使用组 ...
- 在kotlin companion object中读取spring boot配置文件,静态类使用@Value注解配置
在kotlin companion object中读取配置文件 静态类使用@Value注解配置 class Config {@Value("\${name}")fun setNam ...
- Object的finalize()方法的作用是否与C++的析构函数作用相同
Object的finalize()方法的作用是否与C++的析构函数作用相同 public class Finalization {private static Finalization finaliz ...
- libgstreamer-1.0.so.0: cannot open shared object file: No such file or directory
1. 问题现象 error while loading shared libraries: libgstreamer-1.0.so.0: cannot open shared object file: ...
- RuntimeError: Expected object of backend CUDA but got backend CPU for argument
RuntimeError: Expected object of backend CUDA but got backend CPU for argument #4 'mat1' 原因:变量没有加cud ...
- RuntimeError: Expected object of device type cuda but got device type cpu for argument pytorch数据位置
RuntimeError: Expected object of device type cuda but got device type cpu for argument #2 'target' i ...
- Python错误:AttributeError: 'generator' object has no attribute 'next'解决办法
今天在学习生成器对象(generation object)运行以下代码时,遇到了一个错误: #定义生成器函数 def liebiao(): for x in range(10): yield x #函 ...
- Java OOP(Object Oriented Programming)个人理解及总结
面向对象编程(Object Oriented Programming,OOP,面向对象程序设计) 其三大特征:封装,继承,多态: 封装:解决数据的安全问题. 继承:解决代码的重用问题. 多态:解决程序 ...
- 目标检测数据集The Object Detection Dataset
目标检测数据集The Object Detection Dataset 在目标检测领域,没有像MNIST或Fashion MNIST这样的小数据集.为了快速测试模型,我们将组装一个小数据集.首先,我们 ...
- 多尺度目标检测 Multiscale Object Detection
多尺度目标检测 Multiscale Object Detection 我们在输入图像的每个像素上生成多个锚框.这些定位框用于对输入图像的不同区域进行采样.但是,如果锚定框是以图像的每个像素为中心生成 ...
最新文章
- tornado项目搭建_Day71-73 BBS项目(1)
- restful规范和APIView
- 软工随堂练 找出和值最大的子矩阵 尹亚男 赵静娜
- TTS技术简单介绍和Ekho(余音)TTS的安装与编程
- (7)Zynq AXI_GP接口介绍
- 串口发送接收浮点型数据
- json 例子_json-简单的例子
- oracle密码安全策略,提升Oracle用户密码安全性的策略
- Windows编译运行EasyPR
- HMM,MEMM,CRF模型的比较
- 1024程序员节Bilibili电脑8位密码谜底
- oracle11g基于bootstrap$中的ind$表损坏系列五
- Flutter 中TextField的hintText不居中与光标位置不一致
- OPNET入门2-Basic Process
- CIA长期对华开展网络攻击,谍影重重缘起此处
- 转行做美工设计有没有前途?0基础怎么学好美工设计?
- 拉上谷歌高通 三星围攻苹果
- 灰色关联分析过程及代码实现
- 欧盟委员会发布英国数据充分性决定草案
- SecureCRT使用方法+下载链接
热门文章
- LocalDateTime时间加减法
- matlab超限像素平滑法_教程 | 不做手残党,玩转像素风LOGO的三大实用技巧!
- 小D课堂 - 零基础入门SpringBoot2.X到实战_第1节零基础快速入门SpringBoot2.0_2、SpringBoot2.x依赖环境和版本新特性说明...
- 阶段3 3.SpringMVC·_01.SpringMVC概述及入门案例_07.入门案例中使用的组件介绍
- 阶段3 2.Spring_06.Spring的新注解_1 spring的新注解-Configuration和ComponentScan
- SQL2005之后MS SQL版本 T-SQL 新增语法、函数(二)
- 实验四【bx】和loop的使用
- 通过try、except和else的使用来使Python程序更加“强壮”
- VM虚拟机,Linux系统安装tools过程遇到 what is the location of the “ifconfig” program
- LeetCode——remove-duplicates-from-sorted-list