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
相关推荐
未来猫咪花17 分钟前
Everything is ViewModel:让状态管理回到对象世界
android·flutter·ios
迷迭香yy22 分钟前
基金档案数据工程实战从收入分析到持仓穿透的Python解析 IG50免费开源股票数据API接口
开发语言·python
晊晌_h1 小时前
嵌入式从0到精通——线程
java·开发语言·jvm
一木 之林1 小时前
五、C++ 新特性、关键字与编译原理(进阶)(二)
java·开发语言·c++
OPEN-F1 小时前
C++11/14新特性精讲:移动语义与智能指针实战
开发语言·c++·算法
小灰灰搞电子1 小时前
Rust+Slint 实现动态轮播图源码分享,支持动态删除、添加
开发语言·rust·slint·动态轮播图
前端 贾公子1 小时前
第09章:上下文与记忆 (6)
开发语言·前端·python
Crazy_MT1 小时前
不越狱,iPhone 为什么也能安装任意 IPA?聊聊 iLoader、SideStore 和 LiveContainer 的原理
ios·开源
sunburn-2 小时前
Java堆(Heap)详解与实战教学
java·开发语言·数据结构·ide·算法