http://www.itjxue.com  1970-01-01 08:00  来源:  点击次数: 

Object C和C++有什么区别

Objective-C 与 C++ 的区别:

1, 两者最大的相同便是: 都是从 C 演化而来的面向对象语言, 两者都兼容标准 C 语言.

2, 两者最大的不同便是: Objective C 提供了运行期动态绑定机制, 而 C++ 是编译时静态绑定, 并通过嵌入类(多重继承)和虚函数(虚表)来模拟实现. Objective C 在语言层次上支持动态消息转发, 其函数调用语法为 [object function], 而且C++ 为 object-function(). 两者的语义也有不同, 在 Objective C 里是说发送消息到一个对象上, 至于这个对象能不能处理消息(也就是说实现了这个函数与否)以及是处理还是转发消息都不会 crash, 而在 C++ 里是说对象进行了某个操作,如果对象没有这个操作的话,要么编译会报错(静态绑定),要么程序会 crash 掉的(动态绑定).

3, Objective C 不支持多重继承, 而 C++ 支持. 不过 Objective C 通过 proxy(代理) 和 Category(类别) 可以更优雅地实现这一特性. 这一点也包括了 overwriting(覆盖) 和 overloading(重载) 两者的不同.

4, 函数名字解析也不同, Objective C 的函数名字解析是函数名称 + 参数名称的, 而 C++ 只包括函数名称. 因此在 Objective C 中以下是合法的,因为两者解析出来分别类似于 foo:bar1: 和 foo:bar2:, 是不同的;

-(int)foo:(int) bar bar1:(int)bar;

-(char*)foo:(int) bar bar2:(int)bar;

而在 C++ 中以下是非法的, 编译将出错, 因为两者解析出来都是类似于 foo:int, 编译器无法辨别.

int foo(int bar, int bar1);

char* foo(int bar, int bar2);

5, Objective-C 没有 C++ 里有的构造函数和析构函数, 其对应物为 alloc-init/free .

6, Objective-C 2.0 了加入了垃圾回收机制(在 iPhone 和 iPad 上不可用), 而 C++ 没有.

7, Objective-C 不允许在 Stack 上分配内存, 只能在 heap 上进行, 而 C++ 两者都允许.

8, Objective-C 不支持引用, 而 C++ 支持.

9, Objective-C 不支持模板, 而 C++ 支持.

10, Objective-C 是 Smalltalk 系的, 而 C++ 是 Simula 系的.

可以这么说 Objective-C 在 C 之上进行了一层简单的包装, 而 C++ 在 C++ 之上进行了复杂的包装, 但 Objective-C 让人感觉更优雅简洁.

参考:

Objective-C 和 Java 很像,区别在哪儿

1.类比较

objC:例如创建一个bird的类

@Interface bird{

@private int foot;

}

-(void)eat{

NSLog(@"what is the bird eat?");

}

@end

objectC是以"-"和“+”开头的类方法,-(void)eat:(id)sender{}加:是带参数的,void是eat方法的返回类型,参数的描述包含两个部分:圆括号中的参数类型以及圆括号后面的参数名。

java: class bird{

private int foot;

public void eat(){

system.out.println("what is the bird eat?");

}

}

C++:class bird{

private:int foot;

pubblic:eat();

};

与java和C++一样ObjC的类也可以继承其他类,几乎所有的类都要继承NSObject的基类,继承方法也类似于C++但public和priavte关键字不能在父类前。注意objec和java一样不能多继承。

这里java中的interface在objectC就是protocol,但是在java中可以多接口,只能单继承,这一点ObjetC和java相似。

2.实例化

在C++中创建实例:Bird *bird =new Bird();

在java中创建实例:Bird bird=new Bird();

而在objectC中则是: Bird *bird=[Bird alloc];这里的alloc是释放的bird创建实例的消息调度。

3.消息

objectC一般调用alloc的调用函数,如Bool listening =[bird isListening];

在C++中则会这样:bool listening =bird- isListening();

在java中就会是:boolean listening =bird.isListening();

若要带参数:[bird runEvent:fly];

C++:bird-run(fly);

java:bird.runEvent(fly);

4.成员变量

在ObjectC中self就像c++和java中的this一样,ObjectC的类方法就使用self关键字。

5.内存管理

objectC不像java那样有垃圾收集器可以看管对象释放及分配内存,若objectc没有内存管理的话,就会泄露内存。因此relase就是一个内存释放器,当通过alloc函数或是以new copy 开头的函数创建NSObject的子类实例时就将计数值-1,变成0就是由1-0若没有内存管理,则计数值不会变成0.

这些是比较典型的,其实还有很多相同和不同之处。

因为objectC是c的超集。也就是可以用C来写,其实在objectc的项目中可以添加C++语法,这样的混编,文件的扩展名也就变成了.mm文件。

object-c的优点及缺点

Objective-C是非常“实际”的语言。它使用一个用C写成、很小的运行库,只会令应用程序的大小增加很小,和大部分OO系统使用极大的VM执行时间会取代了整个系统的运作相反,ObjC写成的程序通常不会比其原始码大很多。而其库函数(通常没附在软件发行本)亦和Smalltalk系统要使用极大的内存来开启一个窗口的情况相反。 Objective-C的最初版本并不支持垃圾回收。在当时这是争论的焦点之一,很多人考虑到Smalltalk回收时有漫长的“死亡时间”,令整个系统失去作用。Objective-C为避免此问题才不拥有这个功能。虽然某些第三方版本已加入这个功能(尤是GNUstep),Apple在其Mac OS X 10.3中仍未引入这个功能。 另一个问题是ObjC不包括命名空间机制(namespace mechanism)。取而代之的是程序设计师必须在其类别名称加上前缀,时常引致冲突。在2004年,在Cocoa编程环境中,所有Mac OS X类别和函数均有“NS”作为前缀,例如NSObject或NSButton来清楚分辨它们属于Mac OS X核心;使用“NS”是由于这些类别的名称在NeXTSTEP开发时定下。 虽然Objective-C是C的母集,但它也不视C的基本型别为第一级的对象。 和C++不同,Objective-C不支持运算子重载(它不支持ad-hoc多型)。亦与C++不同,但和Java相同,Objective-C只容许对象继承一个类(不设多重继承)。Categories和protocols不但可以提供很多多重继承的好处,而且没有很多缺点,例如额外执行时间过重和二进制不兼容。

Object-C基础结构

@interface:标志类的开始

Bread:定义的类名

NSObject:被继承的父类

@interface与@end中间:该类声明的属性和方法

@end:标志类的结束

#import "Bread.h":导入该类的头文件,说明该实现文件实现的类的声明文件

@implementation:标志该实现文件实现的开始

Bread:指明被实现的类

@end:标志该实现文件的结束

类的头文件内在定义时声明了两个成员变量:字符型变量brand和flavor。因其默认读取权限为protected,即受保护的,其他地方若需访问这两个属性,必须通过其自身提供的set和get方法。

用于记录每个变量的状态,例如分组列表每个分组的开关状态。

属性变量无需像成员变量一样必须先手动实现其set和get方法,属性变量声明以后即可调用。

属性变量自动实现的内容:

①自动生成一个对应的成员变量,变量名为属性变量名前加下划线"_"。

②自动提供了对应的set方法:set*和get方法:*

?? *set方法变量名数字母大写;get方法方法名即变量名,无get是为了与系统其他方法名区分开。

③提供了set和get方法的具体实现。

*属性变量中的self指代调用者,即谁调用,self就指代谁。

绝大多数情况均使用属性变量

导入被实例化的类的头文件--Bread *bd来接收[Bread new]的对象

[Bread alloc]实例化并分配内存空间

[Bread init]实例化并对内存空间初始化

*使用new只能默认init进行初始化,alloc方式可以使用其它的init开头的方法进行初始化。

*默认的init方法中 , 什么都没有做,直接返回了self , 所以,如果没有重写init的话, [Class alloc] 和 [[Class alloc]init] 是等价的.其中alloc为类方法,init为实例方法。

?????? ?? 单参数方法

-:表明该方法为实例方法,该方法必须再该类实例化为对象以后才可以调用。

void:表明该方法不返回返回值。返回值只能为单一对象,一个字符,一个数组等。

setBrand:构造的方法的方法名。

NSString *:表明方法参数的类型。

aBrand:传入的参数在方法内的别名。

????? 多参数方法

andFlavor:标签,其作用是解释下一个参数的含义和使方法名更连贯更通俗易懂。

其他部分与单参数方法相同。

??????????? 函数前缀与声明部分相同,该方法的作用是将外部传来的参数aBrand和aFlavor赋值给该类的成员变量brand和flavor以及将自身的这两个成员变量通过方法返回值的形式传递给外部。达到外部对该类成员变量的存取操作。

bd4:调用方法的具体对象。

brand:用于接收方法的返回值。

达利园/蒜泥味:调用方法时传递的参数。

Object C 属性、特性、类型

@property声明属性,做了三件事

.h: 声明了getter和setter方法;

.h: 声明了实例变量(默认:下划线+属性名);

.m: 实现了getter和setter方法。

是否给setter和getter加锁,是否保证setter或者getter的每次访问是完整性的

atomic (默认值)

一定程度上可以保证线程安全,有线程在访问setter,其他线程只能等待完成后才能访问。

nonatomic

不保证你获得的是有效值

readwrite,就是告诉编译器,同时生成getter和setter。如果是readonly,只生成getter。

readwrite: 「读写」

readonly:? 「只读」

strong (默认值)

表明你需要引用(持有)这个对象,负责保持这个对象的生命周期。

基本数据类型(非对象类型,如int, float, BOOL),默认值并不是strong,strong只能用于对象类型。

weak

跟strong相反,属性所指的对象销毁时,属性值也会清空,设置为nil。

会给你一个引用,指向对象。但是不会主张所有权。也不会增加retain count。

在delegate patterns中常用weak解决strong reference cycles(以前叫retain cycles)问题。

copy

会在赋值前,复制一个对象,指向新对象

NSString,NSArray,NSDictonary,推荐使用copy属性

NSMubtableString,NSMutableArray, NSMutableDictonary属性则使用strong属性。

assign

针对基本数据类型赋值操作。

nullable :对象「可为空」

nonnull :对象「不可为空」

null_unspecified :「未指定」

null_resettable :调用setter去reset属性时,可以传入nil,但是getter返回值,不为空。

① 四种整型 :

short int : 短整型, 占16位, mac 上占 2 字节, ios 上占 2 字节, 范围 -32768(-2^15) ~ 32767(2^15 - 1), 3万;

int : 整型, 占32位, mac 上占 4 字节, ios 上占 4 字节, 范围 -2147483648(-2^31) ~ 2147483647(2^31 - 1), 21亿;

long int : 长整型, 占64位, mac 上占 8 字节, ios 上占 4 字节, (-2^63) ~ (2^63 - 1), 922亿亿;

long long : 占64位, mac 上占 8 字节, ios 上占 8 字节;

② 进制 :

八进制 十六进制赋值?: 八进制由 "0" 开头, 十六进制由 "0x" 或者 "0X" 开头;

③ 无符号整型:

无符号整型 第一位 不是符号位, 范围比原来要大,例?unsigned short int 范围是 0到6万

--? %d ?: 十进制整数, 正数无符号, 负数有 "-" 符号;

--? %o ?: 八进制无符号整数, 没有 0 前缀;

--? %x ?: 十六进制无符号整数, 没有 0x 前缀;

-- ?%u ?: 十进制无符号整数;

单个字符表示 : 使用 '' 将单个字符引起来, 便是字符常量, 如 'a', 'b' 等;

转义字符表示 : 使用转义符号 \ 来指定字符, 如 '\n' 等;

字符占用空间大小 : 每个字符占用一个字节, 因此 Object-C 不支持中文字符, 因为中文字符都是占 2 ~ 3 个字节;

--? %c ?: 单个字符输出;

--? %s ?: 输出字符串;

float ?: 占 4 字节;

double ?: 占 8 字节;

long double ?: 占 16 字节;

CGFloat :对于需要兼容64位机器的程序而言,需要用CGFloat,当然从长远角度考虑还是推荐尽量使用CGFloat。尽管在32位上相比float增加了一些memory footprint的消耗

(Object-C浮点数?: 不区分 double 与 float, 一个浮点数 3.8 可以赋值给两种类型的变量)

--? %f? : 以小数形式输出浮点数, 默认 6 位小数;

--? %e? : 以指数形式输出浮点数, 默认 6 位小数;

--? %g ?: 自动选择 %e 或者 %f 各式;

① 定义普通枚举:

定义方式 : 格式 enum enum_name {elem1, elem2, elem3 ...};

示例 : enum day{Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday};

定义枚举变量 : 格式 enum enum_name var1, var2;

示例 : enum day today, tomorrow, 注意 today tomorrow 两个变量的取值只能是 day 枚举中定义的值;

枚举变量赋值 : 格式 variable = elm1 ;

示例 : today = Sunday; tomorrow = Friday;

②?定义匿名枚举:

匿名枚举格式 : enum {Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday} today, tomorrow ;

说明 : 两个枚举变量 today 和 tomorrow 只能取值 enum 中得枚举值;

③ 枚举值简介

枚举值常量 : 在 {} 中得是枚举常量 或者 枚举元素, 该元素不是变量, 不能对齐进行赋值, 枚举的值按照定义的顺序 0, 1, 2, 3 以此类推;

枚举值本质 : 枚举值属于无符号整数, 可以使用 %u 占位符打印出来, 其值也能进行大小比较, 和四则运算;

枚举初值 : 枚举值可以在定义的时候赋予一个初值;

--? %p? : 输出十六进制形式的指针地址;

--? %@ ?: 输出 Object-C 对象;

BOOL 类型值 ?: 该类型至右两个值 YES 和 NO ;

BOOL 类型本质 ?: 该类型本质是 signed char,?YES 是 1,?NO 是 0, 在处理的时候?YES 会被当成真处理,?NO 会被当成假处理;

nil相当于Java中的null,表示一个对象,这个对象的指针指向空。Nil是定义一个指向空的类而不是对象。

可以存放任何数据类型的对象,类似Java中的Object类,其被定义为指向对象的指针(本身就是指针了),故定义比如id instance = nil;

id类型是多态和动态绑定的基础。

Object C 数字、字符串、集合、字典、NSURL、NSDate

下一章: Object C 数字、字符串、集合、字典、NSURL、NSDate - (jianshu.com)

(责任编辑:IT教学网)

更多
上一篇:没有了

推荐Frontpage教程文章