---
title: "Objective-C语言基础"
author: "Perrin Yong"
author_profile: https://www.pystone.net/profile/
published_by: "Perrin Yong"
canonical: https://www.pystone.net/notes/objective-c-language-basics/
type: note
content_role: unspecified
visibility: public
id_stability: rename-stable
source_path: "10-计算机、信息技术与工程/02-编程语言与运行时/Objective-C语言基础.md"
content_hash: fa913905d8de9dccd9faa1d627bf2e995c635b8ab0f2795a1c81cfb69c7a2533
knowledge_version: 224c990773de.5fa8af6e39fa
site_commit: 224c990773de166d23a886306577dd90379529ce
notes_commit: 5fa8af6e39fa3891d1b9b4832bfa6c4e0ecaaf0a
---
# Objective-C语言基础
Objective-C 是一种扩展了 C 语言的编程语言，增加了面向对象编程（OOP）特性。它结合了 C 语言的功能和 Smalltalk 的面向对象特性。以下是 Objective-C 的一些主要特性及示例：

### 主要特性

1. **类和对象**

   * **类**：定义对象的模板，包括属性和方法。
   * **对象**：类的实例，可以调用类的方法和访问类的属性。

2. **消息传递**

   * **消息传递**：Objective-C 中的方法调用使用消息传递机制，类似于 Smalltalk。

3. **动态类型和动态绑定**

   * **动态类型**：类型信息在运行时决定。
   * **动态绑定**：方法的具体实现直到运行时才确定。

4. **内存管理**

   * **手动引用计数（MRC）**：通过 retain 和 release 管理内存。
   * **自动引用计数（ARC）**：编译器自动插入内存管理代码。

5. **协议**

   * **协议**：定义一组方法，任何类都可以实现这些方法，类似于 Java 中的接口。

6. **分类（Category）**

   * **分类**：扩展现有类的功能而无需创建子类。

### 示例代码

#### 类和对象

```objc
#import <Foundation/Foundation.h>

@interface Person : NSObject {
    NSString *name;
    int age;
}

- (void)setName:(NSString *)n;
- (void)setAge:(int)a;
- (void)printInfo;

@end

@implementation Person

- (void)setName:(NSString *)n {
    name = n;
}

- (void)setAge:(int)a {
    age = a;
}

- (void)printInfo {
    NSLog(@"Name: %@, Age: %d", name, age);
}

@end

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        Person *person = [[Person alloc] init];
        [person setName:@"John Doe"];
        [person setAge:30];
        [person printInfo];
    }
    return 0;
}
```

#### 消息传递

```objc
[object methodName];
```

在 Objective-C 中，方法调用被视为向对象发送消息。上面的例子中 `[person setName:@"John Doe"];` 就是向 `person` 对象发送 `setName:` 消息。

#### 动态类型和动态绑定

```objc
id myObject = [[Person alloc] init];
[myObject setName:@"John Doe"]; // 动态绑定，运行时决定调用哪个方法
```

`id` 是一种动态类型，可以在运行时决定具体类型和方法实现。

#### 协议

```objc
@protocol MyProtocol <NSObject>
- (void)doSomething;
@end

@interface MyClass : NSObject <MyProtocol>
@end

@implementation MyClass
- (void)doSomething {
    NSLog(@"Doing something!");
}
@end
```

#### 分类（Category）

```objc
@interface NSString (MyCategory)
- (void)myMethod;
@end

@implementation NSString (MyCategory)
- (void)myMethod {
    NSLog(@"MyCategory method called on %@", self);
}
@end

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        NSString *str = @"Hello, World!";
        [str myMethod]; // 调用分类方法
    }
    return 0;
}
```

### Objective-C 和 C 的比较

1. **面向对象支持**：

   * Objective-C：支持面向对象编程，具有类、对象、继承、多态等特性。
   * C：不支持面向对象编程，主要用于过程化编程。

2. **消息传递**：

   * Objective-C：方法调用使用消息传递机制，更加动态和灵活。
   * C：函数调用是静态的，在编译时决定。

3. **内存管理**：

   * Objective-C：支持自动引用计数（ARC）和手动引用计数（MRC）。
   * C：不提供内置的内存管理机制，需要手动管理内存。

4. **协议和分类**：

   * Objective-C：支持协议和分类，方便代码的扩展和模块化。
   * C：没有类似的特性。

通过以上的介绍和示例，展示了 Objective-C 的主要特性和与 C 语言的区别。Objective-C 在保留 C 语言高效和灵活的基础上，增加了面向对象编程的支持，使其在开发复杂应用时更加方便和高效。


## 几种语言文件后缀


1. **.h 文件**

   * **含义**：头文件，包含函数、类、变量的声明。
   * **用途**：用于声明接口，供多个源文件共享。

2. **.c 文件**

   * **含义**：C 语言源文件。
   * **用途**：包含用 C 语言编写的代码。

3. **.cpp 文件**

   * **含义**：C++ 源文件。
   * **用途**：包含用 C++ 语言编写的代码。
   * **区别**：与 `.c` 文件相比，`.cpp` 文件支持 C++ 的所有特性，包括面向对象编程、模板等。

4. **.cc 文件**

   * **含义**：C++ 源文件，通常在某些项目中作为 `.cpp` 文件的替代后缀。
   * **用途**：同样包含用 C++ 语言编写的代码。
   * **区别**：在功能上与 `.cpp` 文件相同，只是文件命名的不同选择，具体选择通常取决于项目或团队的命名规范。

5. **.mm 文件**

   * **含义**：Objective-C++ 源文件。
   * **用途**：包含用 Objective-C++ 语言编写的代码，这种语言是 Objective-C 和 C++ 的混合，允许在同一个文件中同时使用这两种语言的特性。
   * **区别**：与 `.m` 文件（Objective-C 文件）不同，`.mm` 文件可以包含 C++ 代码。这对于需要同时使用 Objective-C 和 C++ 的项目非常有用，特别是在 macOS 和 iOS 开发中。
