- 基本 Objective-C
- Objective-C - 主页
- Objective-C - 概述
- Objective-C - 环境设置
- Objective-C - 程序结构
- Objective-C - 基本语法
- Objective-C - 数据类型
- Objective-C - 变量
- Objective-C - 常量
- Objective-C - 运算符
- Objective-C - 循环
- Objective-C - 决策
- Objective-C - 函数
- Objective-C - 块
- Objective-C - 数字
- Objective-C - 数组
- Objective-C - 指针
- Objective-C - 字符串
- Objective-C - 结构
- Objective-C - 预处理器
- Objective-C - Typedef
- Objective-C - 类型转换
- Objective-C - 日志处理
- Objective-C - 错误处理
- 命令行参数
- 高级 Objective-C
- Objective-C - 类和对象
- Objective-C - 继承
- Objective-C - 多态性
- Objective-C - 数据封装
- Objective-C - 类别
- Objective-C - 摆姿势
- Objective-C - 扩展
- Objective-C - 协议
- Objective-C - 动态绑定
- Objective-C - 复合对象
- Obj-C - 基础框架
- Objective-C - 快速枚举
- Obj-C - 内存管理
- Objective-C 有用资源
- Objective-C - 快速指南
- Objective-C - 有用的资源
- Objective-C - 讨论
Objective-C 类和对象
Objective-C 编程语言的主要目的是将面向对象添加到 C 编程语言中,类是 Objective-C 的核心功能,支持面向对象编程,通常称为用户定义类型。
类用于指定对象的形式,并将数据表示形式和用于操作该数据的方法组合到一个整洁的包中。类中的数据和方法称为类的成员。
Objective-C 特性
该类在两个不同的部分中定义,即@interface和@implementation。
几乎一切都是物体的形式。
对象接收消息,对象通常称为接收者。
对象包含实例变量。
对象和实例变量都有作用域。
类隐藏对象的实现。
属性用于提供对其他类中的类实例变量的访问。
Objective-C 类定义
当您定义类时,您就定义了数据类型的蓝图。这实际上并没有定义任何数据,但它确实定义了类名的含义,即该类的对象将由什么组成以及可以对此类对象执行哪些操作。
类定义以关键字@interface开头,后跟接口(类)名称;和类主体,由一对花括号括起来。在 Objective-C 中,所有类都派生自称为NSObject的基类。它是所有 Objective-C 类的超类。它提供了内存分配和初始化等基本方法。例如,我们使用关键字class定义了 Box 数据类型,如下所示 -
@interface Box:NSObject { //Instance variables double length; // Length of a box double breadth; // Breadth of a box } @property(nonatomic, readwrite) double height; // Property @end
实例变量是私有的,只能在类实现内部访问。
分配和初始化 Objective-C 对象
类提供对象的蓝图,因此基本上对象是从类创建的。我们声明类的对象的方式与声明基本类型变量的方式完全相同。以下语句声明 Box 类的两个对象 -
Box box1 = [[Box alloc]init]; // Create box1 object of type Box Box box2 = [[Box alloc]init]; // Create box2 object of type Box
对象 box1 和 box2 都有自己的数据成员副本。
访问数据成员
可以使用直接成员访问运算符 (.) 来访问类对象的属性。让我们尝试下面的例子来说明问题 -
#import <Foundation/Foundation.h> @interface Box:NSObject { double length; // Length of a box double breadth; // Breadth of a box double height; // Height of a box } @property(nonatomic, readwrite) double height; // Property -(double) volume; @end @implementation Box @synthesize height; -(id)init { self = [super init]; length = 1.0; breadth = 1.0; return self; } -(double) volume { return length*breadth*height; } @end int main() { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; Box *box1 = [[Box alloc]init]; // Create box1 object of type Box Box *box2 = [[Box alloc]init]; // Create box2 object of type Box double volume = 0.0; // Store the volume of a box here // box 1 specification box1.height = 5.0; // box 2 specification box2.height = 10.0; // volume of box 1 volume = [box1 volume]; NSLog(@"Volume of Box1 : %f", volume); // volume of box 2 volume = [box2 volume]; NSLog(@"Volume of Box2 : %f", volume); [pool drain]; return 0; }
当上面的代码被编译并执行时,它会产生以下结果 -
2013-09-22 21:25:33.314 ClassAndObjects[387:303] Volume of Box1 : 5.000000 2013-09-22 21:25:33.316 ClassAndObjects[387:303] Volume of Box2 : 10.000000
特性
Objective-C中引入属性是为了保证类的实例变量可以在类外被访问到。
各部分的属性声明如下。属性以@property开头,这是一个关键字
其后是访问说明符,这些说明符是非Atomics或Atomics、读写或只读以及强、unsafe_unretained 或弱。这根据变量的类型而变化。对于任何指针类型,我们都可以使用strong、unsafe_unretained 或weak。类似地,对于其他类型,我们可以使用 readwrite 或 readonly。
接下来是变量的数据类型。
最后,我们的属性名称以分号结尾。
我们可以在实现类中添加synthesize语句。但在最新的 XCode 中,综合部分由 XCode 负责,您不需要包含 Synthesize 语句。
只有通过属性我们才能访问类的实例变量。实际上,内部为属性创建了 getter 和 setter 方法。
例如,假设我们有一个属性@property (nonatomic ,readonly ) BOOL isDone。在底层,创建了 setter 和 getter,如下所示。
-(void)setIsDone(BOOL)isDone; -(BOOL)isDone;