【OC】c++快速上手oc语法

本文详细介绍了Objective-C的基础语法,包括类与对象、属性、方法、内存管理(MRC与ARC)、字符串处理、异常处理、面向对象特性、协议、块、KVC和KVO。适合已掌握C++的读者快速上手Objective-C。
摘要由CSDN通过智能技术生成

前置声明,由于笔者学习过c++语言,因此文章中部分知识点会与c++做类比,方便同样学过c++语言的童鞋来学习

接下来,我们将快速学习oc基础语法,来上手OC语言~

下面是一些bjective-C的基础语法要点,以帮助你快速入门:

  1. 声明类:
    Objective-C使用接口和实现文件来声明和定义类。接口文件通常以.h为扩展名,而实现文件通常以.m为扩展名。接口文件包括类的声明,方法和属性的定义,而实现文件包括方法的具体实现。

    // MyClass.h
    @interface MyClass : NSObject
    
    @property (nonatomic, strong) NSString *name;
    
    - (void)printName;
    
    @end
    
    // MyClass.m
    #import "MyClass.h"
    
    @implementation MyClass
    
    - (void)printName {
        NSLog(@"Name: %@", self.name);
    }
    
    @end
    
  2. 创建对象:
    你可以使用[[ClassName alloc] init]来创建对象,或者使用快速创建的语法[ClassName new]

    MyClass *myObject = [[MyClass alloc] init];
    
  3. 方法调用:
    使用方括号调用对象的方法。Objective-C使用消息传递机制。

    [myObject printName];
    
  4. 属性(Properties):
    属性是类的特征,可以通过@property关键字来声明。你可以使用@synthesize或自动生成的存取方法来访问属性。

  5. 内存管理:
    Objective-C使用手动引用计数(Manual Reference Counting,MRC)或自动引用计数(Automatic Reference Counting,ARC)来管理内存。在MRC下,你需要手动管理对象的内存分配和释放。在ARC下,编译器会自动处理内存管理。

  6. 消息传递:
    Objective-C使用消息传递机制来调用方法。消息是一个对象对另一个对象的请求。

    [myObject doSomething];
    
  7. 继承:
    Objective-C支持类的继承。一个类可以继承另一个类的属性和方法,并添加自己的特性。

    @interface MySubclass : MyClass
    // 添加额外的方法和属性
    @end
    
  8. 协议(Protocols):
    协议定义了一组方法,类可以遵循协议并实现其中的方法。

    @protocol MyProtocol
    - (void)doSomething;
    @end
    

方法

在Objective-C中,方法的概念类似于C++中的函数。方法是类中的函数,用于执行特定的操作。以下是一个示例,展示如何在Objective-C中定义和使用方法:

#import <Foundation/Foundation.h>

// 创建一个名为Calculator的类
@interface Calculator : NSObject

- (int)add:(int)num1 to:(int)num2;

@end

@implementation Calculator

- (int)add:(int)num1 to:(int)num2 {
    return num1 + num2;
}

@end

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        // 创建一个Calculator对象
        Calculator *myCalculator = [[Calculator alloc] init];

        // 调用add方法
        int result = [myCalculator add:5 to:7];
        NSLog(@"Result is %d", result);
    }
    return 0;
}

在这个示例中,我们创建了一个名为Calculator的类,其中定义了一个add:to:方法,用于将两个整数相加。方法名包括参数名称,参数之间使用冒号分隔。

main函数中,我们创建了一个Calculator对象,并使用[myCalculator add:5 to:7]的语法来调用add:to:方法,并将结果存储在result中。

类之间的交互

Objective-C中的类之间可以通过消息传递来进行交互,这类似于C++中的函数调用。你可以创建一个类的实例,并通过消息传递机制来调用其方法。

Calculator *myCalculator = [[Calculator alloc] init];
int result = [myCalculator add:5 to:7];

这段代码中,我们创建了一个Calculator对象(类似于C++中的创建对象),然后通过[myCalculator add:5 to:7]的方式向它发送消息,调用了add:to:方法。

字符串处理

Objective-C中的字符串处理类似于C++中的字符串操作。你可以使用NSString类来创建和操作字符串。以下是一个示例:

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        // 创建一个NSString
        NSString *name = @"John";

        // 字符串拼接
        NSString *greeting = [NSString stringWithFormat:@"Hello, %@", name];
        NSLog(@"%@", greeting);

        // 字符串长度
        NSUInteger length = [name length];
        NSLog(@"Name length: %lu", (unsigned long)length);

        // 字符串比较
        if ([name isEqualToString:@"John"]) {
            NSLog(@"Name is John.");
        }
    }
    return 0;
}

在这个示例中,我们创建了一个NSString对象,然后进行了字符串拼接、获取字符串长度和字符串比较等操作。这些操作与C++中的字符串操作非常类似。

异常处理

Objective-C中的异常处理使用@try@catch@finally块,与C++中的异常处理类似。以下是一个示例:

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        @try {
            // 可能引发异常的代码
            NSString *str = nil;
            NSLog(@"Length: %lu", [str length]);
        } @catch (NSException *exception) {
            // 异常处理
            NSLog(@"An exception occurred: %@", [exception reason]);
        } @finally {
            // 无论是否发生异常,都会执行此块
            NSLog(@"Finally block executed.");
        }
    }
    return 0;
}

在这个示例中,我们使用@try块来包裹可能引发异常的代码,然后使用@catch块来处理异常。@finally块中的代码将无论是否发生异常都会执行。

面向对象编程特性

Objective-C是一种面向对象编程语言,它支持封装、继承和多态等面向对象的概念,与C++类似。你可以创建类、定义属性和方法,以及进行类的继承。

// 创建一个名为Person的类
@interface Person : NSObject

@property (nonatomic, strong) NSString *name;
@property (nonatomic) int age;

- (void)sayHello;

@end

// 实现Person类
@implementation Person

- (void)sayHello {
    NSLog(@"Hello, my name is %@, and I am %d years old.", self.name, self.age);
}

@end

这个示例中,我们创建了一个名为Person的类,定义了属性和方法,就像在前面的示例中一样。这是面向对象编程的一部分,与C++中的类定义和对象创建类似。

内存管理

Objective-C的内存管理与C++中的内存管理有一些不同之处,因为Objective-C通常使用引用计数(Reference Counting)来管理对象的内存。与C++的手动内存管理不同,Objective-C提供了自动引用计数(ARC)来自动处理内存管理。下面是一个示例,演示了如何使用ARC来管理内存:

#import <Foundation/Foundation.h>

// 创建一个名为Person的类
@interface Person : NSObject

@property (nonatomic, strong) NSString *name;

- (instancetype)initWithName:(NSString *)name;

@end

@implementation Person

- (instancetype)initWithName:(NSString *)name {
    self = [super init];
    if (self) {
        _name = [name copy]; // 使用copy修饰符来创建一个新的字符串副本
    }
    return self;
}

- (void)dealloc {
    // 手动释放资源(在非ARC模式下)
    // [_name release];
    // [super dealloc];
    NSLog(@"Person object is deallocated.");
}

@end

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        // 创建一个Person对象
        Person *person = [[Person alloc] initWithName:@"John"];
        NSLog(@"Name: %@", person.name);
        
        // Automatic Reference Counting (ARC)会自动处理内存管理
    }
    return 0;
}

在Objective-C中,retainreleaseautorelease这些手动内存管理方法已被ARC自动处理,因此不再需要手动调用它们。如果你想在非ARC模式下(手动引用计数)编写代码,需要手动调用这些方法。

属性修饰符

Objective-C中的属性修饰符类似于C++中的访问修饰符。属性修饰符可以用来定义实例变量的访问权限,包括nonatomicstrongweak等。下面是一个示例:

@property (nonatomic, strong) NSString *name;
  • nonatomic 表示属性是非原子的,多线程环境下要小心使用。
  • strong 表示属性是强引用,对象会在没有任何强引用时被销毁。
  • weak 表示属性是弱引用,对象会在没有强引用后被自动置为nil

这些修饰符与C++中的访问修饰符(如publicprivateprotected)有一定相似之处,用于控制成员变量的可访问性和生命周期管理。

协议

Objective-C中的协议类似于C++中的接口。协议定义了一组方法,类可以遵循(实现)这些方法。下面是一个示例:

@protocol MyProtocol
- (void)doSomething;
@end

类似于C++中的接口,Objective-C中的协议定义了方法签名,但没有提供实现。类可以通过遵循协议来实现这些方法。

希望这些深入的示例帮助你更好地理解Objective-C中的内存管理、属性修饰符和协议,以及它们与C++中的相关概念的对应关系。如果有更多问题或需要进一步的讲解,请随时提问。

块(Blocks)

Objective-C中的块类似于C++中的Lambda表达式,允许你创建匿名函数。块是Objective-C中的一种闭包,可以捕获其周围的变量。以下是一个示例:

// 定义一个块
int (^add)(int, int) = ^(int a, int b) {
    return a + b;
};

// 调用块
int result = add(5, 3);
NSLog(@"Result: %d", result);

在这个示例中,我们创建了一个接受两个整数参数的块,并在块内部执行加法操作。块类似于C++中的Lambda表达式,允许你创建匿名函数。

KVC(Key-Value Coding)

KVC是Objective-C的一个特性,允许你通过键来访问对象的属性,类似于C++中的std::mapstd::unordered_map。以下是一个示例:

// 创建一个字典
NSDictionary *personInfo = @{@"name": @"John", @"age": @30};

// 使用KVC访问字典中的值
NSString *name = [personInfo valueForKey:@"name"];
NSNumber *age = [personInfo valueForKey:@"age"];

在这个示例中,我们使用KVC从字典中获取了名字和年龄属性的值。

KVO(Key-Value Observing)

KVO是Objective-C中的一种观察者模式,用于监视对象属性的变化,类似于C++中的观察者模式。你可以注册一个观察者,以便在属性发生变化时得到通知。以下是一个示例:

// 创建一个Person类
@interface Person : NSObject
@property (nonatomic, strong) NSString *name;
@end

@implementation Person
@end

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        Person *person = [[Person alloc] init];

        // 注册观察者
        [person addObserver:person forKeyPath:@"name" options:NSKeyValueObservingOptionNew context:nil];

        // 修改属性值
        [person setValue:@"Alice" forKey:@"name"];
    }
    return 0;
}

在这个示例中,我们创建了一个Person类,然后注册了一个观察者来监视name属性的变化。当属性值变化时,观察者会得到通知,类似于C++中的观察者模式。

异常处理

Objective-C的异常处理机制与C++中的异常处理类似,使用@try@catch@finally块。你可以使用@throw抛出异常,然后在@catch块中处理异常。下面是一个示例:

@try {
    // 可能引发异常的代码
    @throw [NSException exceptionWithName:@"MyException" reason:@"Something went wrong" userInfo:nil];
} @catch (NSException *exception) {
    // 异常处理
    NSLog(@"An exception occurred: %@", [exception reason]);
} @finally {
    // 无论是否发生异常,都会执行此块
    NSLog(@"Finally block executed.");
}

在这个示例中,我们使用@throw抛出异常,并在@catch块中处理异常。@finally块中的代码会无论是否发生异常都会执行,与C++中的try-catch块类似。

这篇文章带领你以最快速度入门,下一篇文章是一些注意点和思考点,持续更新中~

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值