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

assign与weak都是弱引用。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
相关推荐
wangchunyu11422 分钟前
Python 数据可视化实战入门教程
开发语言·python·信息可视化
学逆向的2 小时前
C 突破编译器限制
c语言·开发语言·网络安全
jimy12 小时前
C++ 虚函数表:基类和派生类共用一张 vtable 吗?
开发语言·c++
爱吃提升2 小时前
Dev-C++ 5.11 C++断点调试完整教程
开发语言·c++
夜晚回家2 小时前
Python 原始字符串详解 | r 前缀到底让什么不再转义
开发语言·python
陈年老古董2 小时前
PyQt5 入门指南:环境搭建、PyCharm 外部工具配置与登录界面实战
开发语言·qt·pycharm
看浪的路人2 小时前
第7讲:大模型后端服务化——Go 实现高并发 LLM Proxy / Router / Fallback
开发语言·后端·golang
iCxhust3 小时前
Matlab求解发电机的极限切除角
开发语言·算法·matlab·电力系统
zhanghaha13143 小时前
Qt 类完整例程【逐词拆解 + 逐步骤执行保姆教程】
开发语言·qt
code2cat3 小时前
Java进阶篇之AtomicReferenceFieldUpdater:用不可变快照替换整份状态
java·开发语言·cas