22、Objective - C 编程快速入门

Objective - C 编程快速入门

Objective - C 是苹果公司主要用于编写 Mac OS X 和 iPhone 应用程序的面向对象编程语言。它是标准 ANSI C 语言的扩展,对于熟悉 C 语言的人来说,学习起来相对容易。本文将介绍 Objective - C 的一些基础知识,包括文件类型、指令、类、实例化、字段、方法、消息发送、属性和初始化器等内容。

1. 文件类型

Objective - C 源代码文件主要分为两种类型:
- .h :头文件,用于声明类、方法、属性等。
- .m :实现文件,用于实现类的方法和功能。

2. 指令

在 Objective - C 中,常用的指令有 #import @interface @implementation @class 等。
- #import :预处理器指令,用于包含文件内容。与 C 和 C++ 中的 #include 不同, #import 确保文件最多只包含一次。
- 导入框架的头文件:使用尖括号 <> ,例如 #import <Foundation/Foundation.h>
- 导入项目内的头文件:使用双引号 "" ,例如 #import "SomeClass.h"

示例代码如下:

// SomeClass.h
#import <Foundation/Foundation.h>
@interface SomeClass : NSObject {
}
@end

// SomeClass.m
#import "SomeClass.h"
@implementation SomeClass
@end
3. 类

在 Objective - C 中,类的声明和定义是通过 @interface @implementation 指令完成的。
- @interface :用于声明类,通常在头文件中使用。

@interface SomeClass : NSObject {
}

上述代码声明了一个名为 SomeClass 的类,它继承自 NSObject 类。
- @implementation :用于实现类,通常在实现文件中使用。

#import "SomeClass.h"
@implementation SomeClass
@end
  • @class :用于前向声明类,避免循环包含问题。
// SomeClass.h
#import <Foundation/Foundation.h>
@class AnotherClass;
@interface SomeClass : NSObject {
    AnotherClass *anotherClass;
}
@end

// AnotherClass.h
#import <Foundation/Foundation.h>
@class SomeClass;
@interface AnotherClass : NSObject {
    SomeClass *someClass;
}
@end
4. 类的实例化

要创建类的实例,通常使用 alloc 关键字分配内存,然后调用 init 方法进行初始化。

SomeClass *someClass = [[SomeClass alloc] init];

在声明对象时,需要在对象名前加上 * 字符;而声明基本类型变量时,则不需要。例如:

CGRect frame;  // CGRect 是结构体
int number;    // int 是基本类型
NSString *str; // NSString 是类

此外,还可以使用 id 类型,它可以引用任何类型的对象。

id someClass = [SomeClass alloc];
id str;
5. 字段

字段是对象的数据成员。例如, SomeClass 类可以有以下字段:

#import <Foundation/Foundation.h>
@class AnotherClass;
@interface SomeClass : NSObject {
    AnotherClass *anotherClass;
    float rate;
    NSString *name;
}
@end
6. 访问权限

Objective - C 中字段的访问权限有三种:
| 访问权限 | 说明 |
| ---- | ---- |
| @private | 仅对声明该字段的类可见 |
| @public | 对所有类可见 |
| @protected | 对声明该字段的类及其子类可见 |

默认情况下,字段的访问权限为 @protected 。如果要直接访问类中的字段,可以使用 -> 运算符。例如:

SomeClass *someClass = [SomeClass alloc];
someClass->rate = 5;
someClass->name = @"Wei-Meng Lee";

不过,直接访问字段违反了面向对象编程的封装原则,更好的做法是将字段封装在属性中。

7. 方法

Objective - C 支持两种类型的方法:实例方法和类方法。
- 实例方法 :只能通过类的实例调用,方法名前加 - 号。
- 类方法 :可以直接使用类名调用,方法名前加 + 号。

示例代码如下:

#import <Foundation/Foundation.h>
@class AnotherClass;
@interface SomeClass : NSObject {
    AnotherClass *anotherClass;
    float rate;
    NSString *name;
}
// 实例方法
-(void) doSomething;
-(void) doSomething:(NSString *) str;
-(void) doSomething:(NSString *) str withAnotherPara:(float) value;
// 类方法
+(void) alsoDoSomething;
@end

#import "SomeClass.h"
@implementation SomeClass
-(void) doSomething {
    // 实现代码
}
-(void) doSomething:(NSString *) str {
    // 实现代码
}
-(void) doSomething:(NSString *) str withAnotherPara:(float) value {
    // 实现代码
}
+(void) alsoDoSomething {
    // 实现代码
}
@end

调用实例方法和类方法的示例:

SomeClass *someClass = [SomeClass alloc];
[someClass doSomething];
[someClass doSomething:@"some text"];
[someClass doSomething:@"some text" withAnotherPara:9.0f];
[SomeClass alsoDoSomething];
8. 消息发送(调用方法)

在 Objective - C 中,调用方法实际上是向对象发送消息。消息在运行时解析,编译器不会在编译时强制检查方法名的正确性。
- 无参数方法调用: [object method];
- 有参数方法调用:
- 一个参数: [object method:input1];
- 两个参数: [object method:input1 andSecondInput:input2];

例如:

-(void) doSomething {
    // 实现代码
}
[someClass doSomething];

-(void) doSomething:(NSString *) str withAnotherPara:(float) value {
    // 实现代码
}
[someClass doSomething:@"some text" withAnotherPara:9.0f];

需要注意的是,方法名中冒号的存在与否决定了方法的参数个数。例如, doSomething 表示无参数方法, doSomething: 表示有一个参数的方法, doSomething:withAnotherPara: 表示有两个参数的方法。

方法调用还可以嵌套,但一般不建议嵌套超过三层,以免代码难以阅读。例如:

NSString *str = [[NSString alloc] initWithString:@"Hello World"];

下面是一个简单的 mermaid 流程图,展示了方法调用的基本流程:

graph LR
    A[创建对象] --> B[发送消息]
    B --> C{方法是否存在}
    C -- 是 --> D[执行方法]
    C -- 否 --> E[忽略消息]

通过以上内容,你对 Objective - C 的基础知识应该有了初步的了解。后续还会介绍属性和初始化器等内容,帮助你进一步掌握这门语言。

Objective - C 编程快速入门

9. 属性

属性允许你暴露类中的字段,并控制值的设置和获取方式。在 Objective - C 2.0 之前,需要手动定义 getter 和 setter 方法来实现属性的功能。

以下是手动定义 getter 和 setter 方法的示例:

// SomeClass.h
#import <Foundation/Foundation.h>
@class AnotherClass;
@interface SomeClass : NSObject {
    AnotherClass *anotherClass;
    float rate;
    NSString *name;
}
// 暴露 rate 字段
-(float) rate;
-(void) setRate:(float) value;
// 暴露 name 字段
-(NSString *) name;
-(void) setName:(NSString *) value;
@end

// SomeClass.m
#import "SomeClass.h"
@implementation SomeClass
-(float) rate {
    return rate;
}
-(void) setRate:(float) value {
    rate = value;
}
-(NSString *) name {
    return name;
}
-(void) setName:(NSString *) value {
    [value retain];
    [name release];
    name = value;
}
@end

设置属性值的方式有两种:
- 调用以 set 开头的方法:

SomeClass *sc = [[SomeClass alloc] init];
[sc setRate:5.0f];
[sc setName:@"Wei-Meng Lee"];
  • 使用点符号(Objective - C 2.0 引入):
SomeClass *sc = [[SomeClass alloc] init];
sc.rate = 5;
sc.name = @"Wei-Meng Lee";

获取属性值同样有两种方式:

NSLog([sc name]); // 调用方法
NSLog(sc.name);   // 点符号

若要使属性只读,只需移除以 set 开头的方法。

在 Objective - C 2.0 中,可以使用 @property @synthesize 指令来简化属性的定义。示例如下:

// SomeClass.h
#import <Foundation/Foundation.h>
@class AnotherClass;
@interface SomeClass : NSObject {
    AnotherClass *anotherClass;
    float rate;
    NSString *name;
}
@property float rate;
@property (retain, nonatomic) NSString *name;
@end

// SomeClass.m
#import "SomeClass.h"
@implementation SomeClass
@synthesize rate, name;
@end

@property 用于声明属性, @synthesize 用于让编译器自动生成 getter 和 setter 方法。可以将多个属性组合在一个 @synthesize 语句中,也可以分开声明。

使用属性的方式与之前相同:

// 设置属性值
[sc setRate:5.0f];
[sc setName:@"Wei-Meng Lee"];
sc.rate = 5;
sc.name = @"Wei-Meng Lee";

// 获取属性值
NSLog([sc name]);
NSLog(sc.name);

若要使属性只读,可使用 readonly 关键字:

@property (readonly) NSString *name;
10. 初始化器

创建类的实例时,通常会同时进行初始化操作。例如:

SomeClass *sc = [[SomeClass alloc] init];

alloc 关键字为对象分配内存, init 方法用于初始化对象。 init 方法定义在 NSObject 类中,它是一个初始化器。

如果需要创建额外的初始化器,可以定义以 init 开头的方法。示例如下:

// SomeClass.h
#import <Foundation/Foundation.h>
@class AnotherClass;
@interface SomeClass : NSObject {
    AnotherClass *anotherClass;
    float rate;
    NSString *name;
}
-(void) doSomething;
-(void) doSomething:(NSString *) str;
-(void) doSomething:(NSString *) str withAnotherPara:(float) value;
+(void) alsoDoSomething;
- (id)initWithName:(NSString *) n;
- (id)initWithName:(NSString *) n andRate:(float) r;
@property float rate;
@property (retain, nonatomic) NSString *name;
@end

// SomeClass.m
#import "SomeClass.h"
@implementation SomeClass
@synthesize rate, name;
- (id)initWithName:(NSString *) n
{
    return [self initWithName:n andRate:0.0f];
}
- (id)initWithName:(NSString *) n andRate:(float) r
{
    if (self = [super init]) {
        self.name = n;
        self.rate = r;
    }
    return self;
}
-(void) doSomething {
}
-(void) doSomething:(NSString *) str {
}
-(void) doSomething:(NSString *) str withAnotherPara:(float) value {
}
+(void) alsoDoSomething {
}
@end

上述代码中, initWithName: initWithName:andRate: 是额外定义的初始化器。

下面是一个 mermaid 流程图,展示了对象创建和初始化的流程:

graph LR
    A[alloc 分配内存] --> B[init 初始化对象]
    B --> C{初始化成功?}
    C -- 是 --> D[返回初始化后的对象]
    C -- 否 --> E[返回 nil]

综上所述,Objective - C 是一门功能强大的面向对象编程语言,通过掌握文件类型、指令、类、实例化、字段、方法、消息发送、属性和初始化器等基础知识,你可以开始编写简单的 Objective - C 程序。在实际开发中,还需要深入学习内存管理等高级主题,以确保程序的性能和稳定性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值