目录
Objective - C 全解:从基础到高级特性
引言
基础语法
变量声明与数据类型
条件语句
if - else
switch
循环语句
for 循环
while 循环
do - while 循环
面向对象编程
类和对象
接口文件(Person.h)
实现文件(Person.m)
使用类
继承和多态
父类(Animal.h)
父类实现(Animal.m)
子类(Dog.h)
子类实现(Dog.m)
使用继承和多态
协议
协议定义(Flyable.h)
实现协议的类(Bird.h)
实现协议的类的实现(Bird.m)
使用协议
内存管理
手动引用计数(MRC)
自动引用计数(ARC)
高级特性
类别(Category)
类别定义(NSString+Exclamation.h)
类别实现(NSString+Exclamation.m)
使用类别
键值编码(KVC)和键值观察(KVO)
KVC 示例
KVO 示例
总结
引言
Objective - C 是一种面向对象的编程语言,主要用于 macOS 和 iOS 系统的应用开发。它在 C 语言的基础上添加了面向对象的特性,与 Cocoa 和 Cocoa Touch 框架紧密结合,是苹果生态系统中开发的重要工具。本文将全面介绍 Objective - C 的各个方面,包括基础语法、面向对象编程、内存管理、高级特性等,并结合代码示例进行详细讲解。
基础语法
变量声明与数据类型
Objective - C 基于 C 语言,支持 C 语言的基本数据类型,同时也有一些特定的数据类型,如 NSString 用于处理字符串。
#import
int main(int argc, const char * argv[]) {
@autoreleasepool {
// 基本数据类型
int integerValue = 10;
float floatValue = 3.14f;
double doubleValue = 2.71828;
char charValue = 'A';
BOOL booleanValue = YES;
// 字符串类型
NSString *stringValue = @"Hello, Objective - C!";
NSLog(@"Integer: %d, Float: %f, Double: %lf, Char: %c, Boolean: %d, String: %@",
integerValue, floatValue, doubleValue, charValue, booleanValue, stringValue);
}
return 0;
}
条件语句
Objective - C 支持 if - else 和 switch 条件语句。
if - else
int num = 10;
if (num > 5) {
NSLog(@"num 大于 5");
} else {
NSLog(@"num 小于等于 5");
}
switch
int day = 3;
switch (day) {
case 1:
NSLog(@"星期一");
break;
case 2:
NSLog(@"星期二");
break;
case 3:
NSLog(@"星期三");
break;
default:
NSLog(@"其他");
break;
}
循环语句
Objective - C 支持 for、while 和 do - while 循环。
for 循环
for (int i = 1; i <= 5; i++) {
NSLog(@"%d", i);
}
while 循环
int j = 1;
while (j <= 5) {
NSLog(@"%d", j);
j++;
}
do - while 循环
int k = 1;
do {
NSLog(@"%d", k);
k++;
} while (k <= 5);
面向对象编程
类和对象
在 Objective - C 中,类的定义分为接口(.h 文件)和实现(.m 文件)两部分。
接口文件(Person.h)
#import
@interface Person : NSObject
@property (nonatomic, strong) NSString *name;
@property (nonatomic, assign) NSInteger age;
- (void)introduce;
@end
实现文件(Person.m)
#import "Person.h"
@implementation Person
- (void)introduce {
NSLog(@"我叫 %@,今年 %ld 岁。", self.name, (long)self.age);
}
@end
使用类
#import
#import "Person.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
Person *person = [[Person alloc] init];
person.name = @"Alice";
person.age = 20;
[person introduce];
}
return 0;
}
继承和多态
Objective - C 支持类的继承,子类可以重写父类的方法。
父类(Animal.h)
#import
@interface Animal : NSObject
@property (nonatomic, strong) NSString *name;
- (instancetype)initWithName:(NSString *)name;
- (void)makeSound;
@end
父类实现(Animal.m)
#import "Animal.h"
@implementation Animal
- (instancetype)initWithName:(NSString *)name {
self = [super init];
if (self) {
self.name = name;
}
return self;
}
- (void)makeSound {
NSLog(@"%@ 发出声音", self.name);
}
@end
子类(Dog.h)
#import "Animal.h"
@interface Dog : Animal
@end
子类实现(Dog.m)
#import "Dog.h"
@implementation Dog
- (void)makeSound {
NSLog(@"%@ 汪汪叫", self.name);
}
@end
使用继承和多态
#import
#import "Animal.h"
#import "Dog.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
Dog *dog = [[Dog alloc] initWithName:@"旺财"];
[dog makeSound];
}
return 0;
}
协议
Objective - C 中的协议类似于 Java 中的接口,定义了一组方法的规范。
协议定义(Flyable.h)
#import
@protocol Flyable
- (void)fly;
@end
实现协议的类(Bird.h)
#import
#import "Flyable.h"
@interface Bird : NSObject
@end
实现协议的类的实现(Bird.m)
#import "Bird.h"
@implementation Bird
- (void)fly {
NSLog(@"鸟儿在飞");
}
@end
使用协议
#import
#import "Bird.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
Bird *bird = [[Bird alloc] init];
[bird fly];
}
return 0;
}
内存管理
Objective - C 有两种主要的内存管理方式:手动引用计数(MRC)和自动引用计数(ARC)。
手动引用计数(MRC)
在 MRC 中,需要手动调用 retain、release 和 autorelease 方法来管理对象的生命周期。
#import
@interface MyClass : NSObject
@end
@implementation MyClass
- (void)dealloc {
NSLog(@"MyClass 对象被释放");
[super dealloc];
}
@end
int main(int argc, const char * argv[]) {
@autoreleasepool {
MyClass *obj = [[MyClass alloc] init]; // 引用计数为 1
[obj retain]; // 引用计数为 2
[obj release]; // 引用计数为 1
[obj release]; // 引用计数为 0,对象被释放
}
return 0;
}
自动引用计数(ARC)
ARC 是 Xcode 引入的一种自动内存管理机制,它会自动插入 retain、release 和 autorelease 调用,开发者无需手动管理内存。上面的大部分示例代码都是基于 ARC 的。
高级特性
类别(Category)
类别允许在不修改原有类的实现的情况下,为类添加新的方法。
类别定义(NSString+Exclamation.h)
#import
@interface NSString (Exclamation)
- (NSString *)addExclamation;
@end
类别实现(NSString+Exclamation.m)
#import "NSString+Exclamation.h"
@implementation NSString (Exclamation)
- (NSString *)addExclamation {
return [self stringByAppendingString:@"!"];
}
@end
使用类别
#import
#import "NSString+Exclamation.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
NSString *str = @"Hello";
NSString *newStr = [str addExclamation];
NSLog(@"%@", newStr);
}
return 0;
}
键值编码(KVC)和键值观察(KVO)
KVC 允许通过字符串键来访问对象的属性,KVO 允许监听对象属性的变化。
KVC 示例
#import
@interface MyObject : NSObject
@property (nonatomic, strong) NSString *name;
@end
@implementation MyObject
@end
int main(int argc, const char * argv[]) {
@autoreleasepool {
MyObject *obj = [[MyObject alloc] init];
[obj setValue:@"John" forKey:@"name"];
NSString *name = [obj valueForKey:@"name"];
NSLog(@"Name: %@", name);
}
return 0;
}
KVO 示例
#import
@interface MyObservableObject : NSObject
@property (nonatomic, assign) NSInteger value;
@end
@implementation MyObservableObject
@end
@interface MyObserver : NSObject
@end
@implementation MyObserver
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary
if ([keyPath isEqualToString:@"value"]) {
NSLog(@"Value changed: %@", change);
}
}
@end
int main(int argc, const char * argv[]) {
@autoreleasepool {
MyObservableObject *observable = [[MyObservableObject alloc] init];
MyObserver *observer = [[MyObserver alloc] init];
[observable addObserver:observer forKeyPath:@"value" options:NSKeyValueObservingOptionNew context:nil];
observable.value = 10;
[observable removeObserver:observer forKeyPath:@"value"];
}
return 0;
}
总结
Objective - C 是一门功能丰富、历史悠久的编程语言,在苹果生态系统的开发中有着重要的地位。它结合了 C 语言的高效和面向对象编程的灵活性,同时提供了诸如内存管理、类别、KVC 和 KVO 等高级特性。通过本文的介绍,你应该对 Objective - C 有了一个全面的了解。希望你能在实际开发中运用 Objective - C 来创建出优秀的应用程序。