Objective-C语言该怎么学?

99ANYc3cd6
预计阅读时长 18 分钟
位置: 首页 C语言 正文

Objective-C(通常简写为 Obj-C 或 OC)是一套通用的、面向对象的编程语言,它是在 C 语言的基础上,增加了 Smalltalk 式的“消息传递”机制,成为苹果 macOS 和 iOS 操作系统及其相关 API 的主要开发语言。

objective-c语言
(图片来源网络,侵删)

尽管现在 Swift 语言已成为苹果生态系统的首选新语言,但 Objective-C 仍然拥有庞大的存量代码库、成熟的框架和在某些特定场景下的不可替代性,对于任何希望深入苹果生态的开发者来说,理解 Objective-C 都至关重要。


核心特点

a. C 语言的超集

Objective-C 完全兼容 C 语言,这意味着你可以在 Objective-C 代码中无缝地使用 C 语言的语法、数据类型、函数和指针,任何合法的 C 代码也是合法的 Objective-C 代码。

// 这是一个完全合法的 Objective-C 文件
#include <stdio.h>
int main(int argc, const char * argv[]) {
    printf("Hello, C World!\n");
    return 0;
}

b. 消息传递 vs. 方法调用

这是 Objective-C 与 C++、Java、Swift 等语言最核心的区别。

  • 传统方法调用:编译器在编译时就知道要执行哪个函数,并将它链接到目标代码中,这是一个静态绑定的过程。

    • [object method]; // 在编译时确定 method 的地址
  • 消息传递:你向一个对象发送一个消息,由对象在运行时决定如何响应这个消息,这被称为动态绑定

    • [object message]; // 在运行时查找 object 是否能响应 message

这种动态性带来了极大的灵活性,如果一个对象不能响应某个消息,程序不会直接崩溃,而是可以进入一个“转发”机制,甚至可以在运行时动态地为类添加方法。

c. 运行时系统

Objective-C 的强大功能很大程度上归功于其强大的运行时系统,这个系统在程序运行时负责:

  • 动态创建类和对象。
  • 处理消息的传递和分发。
  • 实现方法转发。
  • 支持关联对象等高级特性。

开发者可以通过 Objective-C Runtime API 与这个系统进行底层交互。

d. Foundation 框架

Foundation 框架是 Objective-C 的基础,提供了许多核心的数据类型、集合类、实用工具类和协议,它类似于 C++ 的 STL 或 Java 的 java.lang 包。

  • NSString: 字符串对象(不可变)
  • NSMutableString: 可变字符串
  • NSArray: 不可变数组
  • NSMutableArray: 可变数组
  • NSDictionary: 不可变字典
  • NSMutableDictionary: 可变字典
  • NSNumber: 将基本数据类型包装成对象
  • NSObject: 几乎所有 Objective-C 类的最终父类

语法与核心概念

Objective-C 的语法非常独特,以方括号 [] 和 符号为标志。

a. “Hello, World!” 示例

#import <Foundation/Foundation.h> // 导入 Foundation 框架
int main(int argc, const char * argv[]) {
    @autoreleasepool { // 自动释放池,用于管理内存
        // 创建一个 NSString 对象,并向它发送 "stringWithUTF8String:" 消息
        NSString *greeting = [[NSString alloc] initWithUTF8String:"Hello, World!"];
        // 向 greeting 对象发送 "uppercaseString" 消息,并将其结果打印
        NSLog(@"%@", [greeting uppercaseString]);
        // 不再需要时,释放对象(在 ARC 下是自动的)
        // [greeting release];
    }
    return 0;
}

b. 类的定义与实现

一个类通常分为两个文件:

  1. 头文件 (.h): 公共接口声明。
  2. 实现文件 (.m): 私有实现细节。

Person.h (接口)

#import <Foundation/Foundation.h>
// @interface 声明一个类
// 继承自 NSObject
@interface Person : NSObject
// 属性声明
// @property 自动生成 getter/setter 方法
// @property (nonatomic, strong) NSString *name;
// nonatomic: 非原子操作,性能更高(在多线程环境下不安全)
// strong: 强引用,ARC 下的默认引用类型,会保持对象的生命周期
@property (nonatomic, strong) NSString *name;
@property (nonatomic, assign) NSInteger age; // assign: 用于基本数据类型
// 方法声明
- (void)sayHello; // 实例方法
+ (void)sayClassHello; // 类方法,以 + 开头
@end

Person.m (实现)

#import "Person.h"
// @implementation 实现一个类
@implementation Person
// 实现 sayHello 方法
- (void)sayHello {
    NSLog(@"Hello, my name is %@ and I am %ld years old.", self.name, (long)self.age);
}
// 实现 sayClassHello 方法
+ (void)sayClassHello {
    NSLog(@"Hello from the Person class!");
}
@end

c. 方法签名

  • (减号): 实例方法,作用于类的实例对象上。
  • (加号): 类方法,作用于类本身,不需要创建实例即可调用(如 + alloc)。

方法名解读: - (void)sayHelloTo:(NSString *)aPerson withGreeting:(NSString *)greeting;

  • 这个方法的全名是 sayHelloTo:withGreeting:
  • 第一个参数 (aPerson) 没有标签,直接跟在方法名后面。
  • 后续参数都有标签 (withGreeting:)。

d. 内存管理

这是 Objective-C 中一个非常重要的主题,分为两个时代:

  1. MRC (Manual Reference Counting - 手动引用计数)

    • 通过 alloc, new, copy, mutableCopy 创建的对象,引用计数为 1。
    • 通过 retain 方法,引用计数加 1。
    • 通过 release 方法,引用计数减 1。
    • 当引用计数为 0 时,对象被销毁。
    • 口诀: 谁创建,谁释放;谁retain,谁release
  2. ARC (Automatic Reference Counting - 自动引用计数)

    • 从 Xcode 4.2 开始引入,是现代 Objective-C 开发的默认标准。
    • 编译器在编译时自动在代码中插入 retain, release, autorelease 等代码。
    • 开发者不再需要手动管理这些调用,但需要理解四种所有权修饰符:
      • __strong: 默认类型,持有强引用,对象会一直存活,只要还有强引用指向它。
      • __weak: 弱引用,不持有对象,对象被销毁时,弱引用会自动置为 nil,避免“野指针”。
      • __unsafe_unretained: 不安全的弱引用,对象被销毁后,指针依然指向原内存地址,容易造成程序崩溃。
      • __autoreleasing: 用于通过引用传递对象,常见于 NSError 的处理。

与 Swift 的关系

苹果在 2025 年推出了 Swift 语言,旨在替代 Objective-C。

  • 互操作性: 这是两者关系中最重要的一点,你可以在同一个项目中混合使用 Swift 和 Objective-C 代码。

    • 从 Swift 调用 Objective-C: 只需将 Objective-C 的头文件(.h)拖入 Xcode 项目,并命名为 YourProjectName-Bridging-Header.h,Swift 代码就可以直接使用 Objective-C 的类和方法。
    • 从 Objective-C 调用 Swift: Xcode 会自动生成一个名为 YourProjectName-Swift.h 的“桥接头文件”,Objective-C 代码可以通过这个文件导入并使用 Swift 中公开的类和方法。
  • 定位:

    • Swift: 现代化的、更安全(类型推断、空安全)、更易学的语言,是所有新项目的首选。
    • Objective-C: 成熟、稳定、灵活,是维护旧项目、访问某些特定 C 语言库或需要利用其运行时动态性的首选。

特性 描述
定位 苹果生态系统的传统主力语言,现与 Swift 并存。
基础 C 语言的超集,兼容所有 C 代码。
核心机制 消息传递,而非方法调用,带来动态性。
内存管理 ARC (现代) 和 MRC (旧项目)。
语法 以方括号 [] 和 符号为标志,较为冗长。
框架 依赖 FoundationCocoa (macOS) / Cocoa Touch (iOS) 框架。
优势 动态性、成熟稳定、庞大的代码库、与 C 无缝互操作。
劣势 语法相对繁琐、安全性不如 Swift(在编译时)。

学习建议:

  • 如果你是新手:直接学习 Swift 更为高效和现代。
  • 如果你需要维护旧项目或深入苹果底层必须学习 Objective-C,学习 Objective-C 也能让你更好地理解苹果框架的设计哲学和运行时机制,反过来也会加深你对 Swift 的理解。
-- 展开阅读全文 --
头像
织梦在线客服代码如何正确添加?
« 上一篇 今天
没有更多啦!
下一篇 »

相关文章

取消
微信二维码
支付宝二维码

目录[+]