6.OC 手動(dòng)內(nèi)存管理
OC 內(nèi)存管理原則:
- 只要使用
alloc
,new
,copy
,mutableCopy
,retain
開頭的方法將一個(gè)對(duì)象的地址賦給一個(gè)指針變量時(shí),該對(duì)象指針就擁有這個(gè)對(duì)象的絕對(duì)使用權(quán),使用后韩脏,就要進(jìn)行release
或autorelease
來釋放對(duì)象。(在MRC環(huán)境下要注意-手動(dòng)內(nèi)存管理)
控制ARC的開關(guān) - 對(duì)象的內(nèi)存空間是由程序員手動(dòng)分配的盗忱,在使用完之后,在MRC環(huán)境之下,就需要手動(dòng)進(jìn)行釋放,如果不及時(shí)釋放就會(huì)造成內(nèi)存泄漏属韧,如果一個(gè)對(duì)象已經(jīng)被釋放/銷毀,再去使用這個(gè)對(duì)象所使用的內(nèi)存空間就會(huì)造成崩潰蛤吓。
// Person.m
#import "Person.h"
@implementation Person
-(void)dealloc
{
[super dealloc];
}
// 內(nèi)存管理實(shí)例方法
-(void)work
{
NSLog(@"%@在工作", _name);
}
@end
-
dealloc
: 為了檢測(cè)到當(dāng)前類的對(duì)象什么時(shí)候被銷魂,需要重寫dealloc
方法糠赦,這個(gè)方法默認(rèn)父類來實(shí)現(xiàn)会傲,在銷毀之前,要由父類來做一些工作拙泽,每當(dāng)調(diào)用dealloc
的時(shí)候淌山,這個(gè)對(duì)象就已經(jīng)被銷毀了,所以NSLog打印要放在[super dealloc]
的前面顾瞻。如果放在后面就會(huì)造成訪問已經(jīng)被銷毀的對(duì)象泼疑,造成崩潰。
#import "ViewController.h"
#import "Person.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// 實(shí)例化 Person
Person *person = [Person new];
[person work];
[person release]; // Attention: release
}
@end
通過打印NSLog(@"%lu", person.retainCount)
可以知道是否被銷毀(0/1)
每當(dāng)出現(xiàn) alloc
, new
, copy
, mutableCopy
, retain
就會(huì)導(dǎo)致引用+1荷荤,就要用release
或者autorelease
-1
訪問僵尸對(duì)象
zombieObject檢測(cè)
不用看了退渗,因?yàn)橄旅嬗凶詣?dòng)內(nèi)存管理哈
7.OC 自動(dòng)內(nèi)存管理
- ARC環(huán)境下移稳,在使用
dealloc
方法時(shí),不要手動(dòng)調(diào)用[super dealloc];
,系統(tǒng)會(huì)自動(dòng)調(diào)用会油,手動(dòng)調(diào)用會(huì)出錯(cuò) - ARC情況下个粱,默認(rèn)Strong指針。
當(dāng)使用一個(gè)強(qiáng)指針指向一個(gè)對(duì)象時(shí)翻翩,就會(huì)引用計(jì)數(shù)+1都许,這個(gè)指針就有了這個(gè)對(duì)象的絕對(duì)使用權(quán)。如果沒有任何強(qiáng)指針指向這個(gè)對(duì)象時(shí)嫂冻,對(duì)象就被立即銷毀
// Person.h
-(void)dealloc
{
[super dealloc];
}
8.OC 的set和get方法
用屬性生成器生成的不需要set和get方法胶征,會(huì)自動(dòng)生成set和get方法。
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
NS_ASSUME_NONNULL_BEGIN
@interface Person : NSObject
// 聲明 3 個(gè)屬性桨仿,用屬性生成器生成的不需要set和get方法睛低,會(huì)自動(dòng)生成set和get方法。
@property(nonatomic, strong)NSString *name;
@property(nonatomic, assign)NSUInteger age;
@property(nonatomic, strong)NSString *gender;
// 聲明 3 個(gè) set 方法
-(void)setName:(NSString * _Nonnull)name;
-(void)setAge:(NSUInteger)age;
-(void)setGender:(NSString * _Nonnull)gender;
// 聲明 3 個(gè) get 方法
-(NSString *)name;
-(NSUInteger)age;
-(NSString *)gender;
@end
NS_ASSUME_NONNULL_END
// Person.m
#import "Person.h"
@implementation Person
// 實(shí)現(xiàn) 3 個(gè) set 方法
- (void)setName:(NSString *)name
{
self.name = name;
}
-(void)setAge:(NSUInteger)age
{
self.age = age;
}
-(void)setGender:(NSString *)gender
{
self.gender = gender;
}
// 實(shí)現(xiàn) 3 個(gè) 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點(diǎn)語法
方便完成賦值和取值操作
[person setName:@"Tom"];
person.name = @"Tim";
10.屬性約束
- 線程安全相關(guān)(原子性)
-
atomic
(原子操作)(默認(rèn)) -
nonatomic
(非原子操作)暇昂,一般情況下,都使用nonatomic
伴嗡,可以提高程序的執(zhí)行效率
-
- 內(nèi)存管理相關(guān)
- MRC下急波,
retain
(強(qiáng)引用),copy
(強(qiáng)引用),assign
(弱引用,賦值瘪校,默認(rèn)) - ARC下澄暮,
strong
(強(qiáng)引用),weak
(弱引用),copy
(強(qiáng)引用),assign
(弱引用阱扬,賦值泣懊,默認(rèn))
- MRC下急波,
- 讀寫屬性相關(guān)
-
readwrite
(同時(shí)生成setter和getter方法)(默認(rèn)) -
readonly
(只會(huì)生成getter方法)
-
- 重命名相關(guān)
-
setter
方法重命名,方法名稱后必須附帶一個(gè)麻惶; -
getter
方法重命名
-
// example
@property (nonatomic, strong) NSString *name; // NSObject對(duì)象需要strong/weak
@property (nonatomic, assign) NSUInteger age; // 基本數(shù)值類型用assign