OC基础语法(与Swift对比)-1

OC分头文件.h和.m文件,业务逻辑基本都写在.m里面。

1.类的声明,修饰符

objectivec 复制代码
@interface  Developer : NSObject
@property (nonatomic, copy) NSString *name;
@property (nonatomic, assign) NSInteger age;
@property (nonatomic, strong) NSArray *skills;
//声明了几个变量copy修饰不可变变量,assign是弱引用,修饰C语言的基础类型

- (instancetype)initWithName: (NSString *)name age:(NSInteger)age;
- (void)printProfile;

@end

OC的所有类都要继承NSObject,如@interface Developer : NSObject

OC的四种修饰方式

1.assign

assignweak都是弱引用。assign一般用于修饰非对象类型,如INT,数字等。

2.strong

return和strong都是强引用。

strong是用于自动释放的(苹果为你管理内存时)、

3.weak

assign与weak都是弱引用。weak修饰的是对象类型,防止其循环引用,比如需要调用delegate的时候,还有就是避免循环引用的时候。

4.retain

手动管理内存时使用。手动释放的时候使用retain,这个是在MRC时代用的(非常古早,现在已经都是ARC了)。

retain与release用于管理内存

5.copy

用copy修饰NSArray就代表数组是不可变的(一定要)。仅用于NSArray

如果说是NSMutableArray,就是使用strong,这代表一个数组是可变的。


例-NSArray用什么修饰?

用copy修饰NSArray就代表数组是不可变的。

类的具体实现

OC需要这样写类

//OC 里手写任何初始化方法,都遵循三步走原则。

//1.self = super init;调用父类的初始化方法

//2.if (self) {...}判断是否获得初始化方法

//3._name = name; 给底层真实存在的成员变量赋值。

//只要写 @implementation,就必须在最后加上 @end 来收尾(示例里略过了@end),就像一对大括号。它们中间包裹的就是所有的函数具体代码。

//第三部分:在控制器里运行测试 (相当于你的主程序入口)

objectivec 复制代码
@implementation Developer

- (instancetype)initWithName:(NSString *)name age:(NSInteger)age {
    self = [super init];
    if (self) {
        _name = name;
        _age = age;
        _skills = @[];
    }
    return  self;
}

函数(方法)

上面创建了一个函数,这里写具体内容。

objectivec 复制代码
-(void)printProfile {
    NSLog(@"开发者: %@, 年龄: %ld, 当前技能树: ", self.name, (long)self.age);
    for (NSString *skill in self.skills) {
        NSLog(@"👉 %@", skill);
    }
}

在控制器里运行测试 (相当于主程序入口)

objectivec 复制代码
@implementation ViewController
- (void)viewDidLoad {
    [super viewDidLoad];
//    实例化对象
    Developer *dev = [[Developer alloc] initWithName:@"iOS" age:23];
//     OC 必须先 alloc (分配内存),再 init (初始化)
//    相当于 Swift: let dev = Developer(name: "iOS", age: 23)
    dev.skills = @[@"SwiftUI", @"UIKit", @"Objective-C"];
// 相当于 Swift: dev.skills = ["SwiftUI", "UIKit", "Objective-C"]
// OC 的字符串必须带 @,数组字面量必须用 @[...]
    dev.age = 24;
// 修改属性
    [dev printProfile];
// 调用方法 相当于 Swift: dev.printProfile()
}

@end
相关推荐
小羊没烦恼!5 小时前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
伞伞悦读6 小时前
【第38期】Python 模块与包详解:import、from、模块搜索路径、包结构和 __init__
开发语言·python
C语言小火车7 小时前
C/C++ 为什么需要编译器?
开发语言·c++
霍霍的袁7 小时前
【C++】map 和 set 的使用 | 从用法到底层
开发语言·c++·学习·visual studio
孙启超8 小时前
【AI开发之Rust】第 11 课:智能指针与内部可变性
开发语言·后端·rust
此生决int8 小时前
深入理解C++系列(20)——C++11(下)
开发语言·c++
CoderYanger9 小时前
A.每日一题:835. 图像重叠
java·开发语言·程序人生·leetcode·面试·职场和发展·学习方法
茶底世界之下10 小时前
为什么预览、录制、离线导出不能共享同一个背压策略?
ios·swift
2501_9160074710 小时前
苹果商店iOS应用上架费用全面解析:开发者计划与审核费用计算
android·ios·小程序·https·uni-app·iphone·webview
伞伞悦读10 小时前
【第37期】Python JSON 与配置详解:序列化、反序列化、嵌套结构和配置文件
开发语言·python·json