Lesson 0-1 Objective-C basic
2019-08-07 本文已影响0人
快乐捣蛋鬼
6.OC 手动内存管理
OC 内存管理原则:
- 只要使用
alloc
,new
,copy
,mutableCopy
,retain
开头的方法将一个对象的地址赋给一个指针变量时,该对象指针就拥有这个对象的绝对使用权,使用后,就要进行release
或autorelease
来释放对象。(在MRC环境下要注意-手动内存管理)
控制ARC的开关 - 对象的内存空间是由程序员手动分配的,在使用完之后,在MRC环境之下,就需要手动进行释放,如果不及时释放就会造成内存泄漏,如果一个对象已经被释放/销毁,再去使用这个对象所使用的内存空间就会造成崩溃。
// Person.m
#import "Person.h"
@implementation Person
-(void)dealloc
{
[super dealloc];
}
// 内存管理实例方法
-(void)work
{
NSLog(@"%@在工作", _name);
}
@end
-
dealloc
: 为了检测到当前类的对象什么时候被销魂,需要重写dealloc
方法,这个方法默认父类来实现,在销毁之前,要由父类来做一些工作,每当调用dealloc
的时候,这个对象就已经被销毁了,所以NSLog打印要放在[super dealloc]
的前面。如果放在后面就会造成访问已经被销毁的对象,造成崩溃。
#import "ViewController.h"
#import "Person.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// 实例化 Person
Person *person = [Person new];
[person work];
[person release]; // Attention: release
}
@end
通过打印NSLog(@"%lu", person.retainCount)
可以知道是否被销毁(0/1)
每当出现 alloc
, new
, copy
, mutableCopy
, retain
就会导致引用+1,就要用release
或者autorelease
-1
zombieObject检测
不用看了,因为下面有自动内存管理哈
7.OC 自动内存管理
- ARC环境下,在使用
dealloc
方法时,不要手动调用[super dealloc];
,系统会自动调用,手动调用会出错 - ARC情况下,默认Strong指针。
当使用一个强指针指向一个对象时,就会引用计数+1,这个指针就有了这个对象的绝对使用权。如果没有任何强指针指向这个对象时,对象就被立即销毁
// Person.h
-(void)dealloc
{
[super dealloc];
}
8.OC 的set和get方法
用属性生成器生成的不需要set和get方法,会自动生成set和get方法。
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
NS_ASSUME_NONNULL_BEGIN
@interface Person : NSObject
// 声明 3 个属性,用属性生成器生成的不需要set和get方法,会自动生成set和get方法。
@property(nonatomic, strong)NSString *name;
@property(nonatomic, assign)NSUInteger age;
@property(nonatomic, strong)NSString *gender;
// 声明 3 个 set 方法
-(void)setName:(NSString * _Nonnull)name;
-(void)setAge:(NSUInteger)age;
-(void)setGender:(NSString * _Nonnull)gender;
// 声明 3 个 get 方法
-(NSString *)name;
-(NSUInteger)age;
-(NSString *)gender;
@end
NS_ASSUME_NONNULL_END
// Person.m
#import "Person.h"
@implementation Person
// 实现 3 个 set 方法
- (void)setName:(NSString *)name
{
self.name = name;
}
-(void)setAge:(NSUInteger)age
{
self.age = age;
}
-(void)setGender:(NSString *)gender
{
self.gender = gender;
}
// 实现 3 个 get 方法
- (NSString *)name
{
return _name;
}
- (NSUInteger)age
{
return _age;
}
-(NSString *)gender
{
return _gender;
}
// 为了打印更多的信息,重写description
-(NSString *)description
{
return [NSString stringWithFormat:@"name = %@, age = %zd, gender = %@", _name, _age, _gender];
}
@end
9.OC点语法
方便完成赋值和取值操作
[person setName:@"Tom"];
person.name = @"Tim";
10.属性约束
- 线程安全相关(原子性)
-
atomic
(原子操作)(默认) -
nonatomic
(非原子操作),一般情况下,都使用nonatomic
,可以提高程序的执行效率
-
- 内存管理相关
- MRC下,
retain
(强引用),copy
(强引用),assign
(弱引用,赋值,默认) - ARC下,
strong
(强引用),weak
(弱引用),copy
(强引用),assign
(弱引用,赋值,默认)
- MRC下,
- 读写属性相关
-
readwrite
(同时生成setter和getter方法)(默认) -
readonly
(只会生成getter方法)
-
- 重命名相关
-
setter
方法重命名,方法名称后必须附带一个; -
getter
方法重命名
-
// example
@property (nonatomic, strong) NSString *name; // NSObject对象需要strong/weak
@property (nonatomic, assign) NSUInteger age; // 基本数值类型用assign