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