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 程序。在实际开发中,还需要深入学习内存管理等高级主题,以确保程序的性能和稳定性。
超级会员免费看
490

被折叠的 条评论
为什么被折叠?



