- 不要等到明天吼和,明天太遙遠(yuǎn)般眉,今天就行動菌湃。
須讀:看完該文章你能做什么脓匿?
能處理ARC和MRC單例的操作
學(xué)習(xí)前:你必須會什么?(在這里我已經(jīng)默認(rèn)你具備C語言的基礎(chǔ)了)
什么是ARC,什么是MRC
一舱卡、本章筆記
一辅肾、單例設(shè)置模式
1.確保只有一個對象
2.重寫copy,mutableCopy方法
3.MRC 重寫 retain、release轮锥、retainCount方法
二矫钓、code
main.m
#pragma mark 21-單例ARC和MRC寫法
#pragma mark - 代碼
#import <Foundation/Foundation.h>
#pragma mark 類
#import "Tools.h"
#pragma mark - main函數(shù)
int main(int argc, const char * argv[])
{
/*
// 單例就是 無論怎么創(chuàng)建 都只能有一個實例對象
// 如果地址相同 就代表著是 同一個實例對象
Tools *t1 = [[Tools alloc]init]; // 內(nèi)部會調(diào)用allocWithZone
Tools *t2 = [Tools new];
Tools *t3 = [Tools shareInstance];
Tools *t4 = [Tools copy];
Tools *t5 = [Tools mutableCopy];
NSLog(@"%p,%p,%p,%p,%p",t1,t2,t3,t4,t5);
*/
Tools *t = [[Tools alloc]init];
[t retain];
[t retain];
[t retain];
NSLog(@"t = %p",t);
NSLog(@"retainCount = %lu",[t retainCount]);
[t release];
Tools *t1 = [Tools shareInstance];
NSLog(@"t1 = %p",t1);
NSLog(@"retainCount = %lu",[t1 retainCount]);
[t1 release];
return 0;
}
Person
>>>.h
#import <Foundation/Foundation.h>
@interface Tools : NSObject<NSCopying,NSMutableCopying>
// 一般情況下 創(chuàng)建一個單例對象 都有一個與之對應(yīng)的類方法
// 一般情況下 用于創(chuàng)建單例對象的方法名稱 都以share開頭,或者default開頭
+ (instancetype)shareInstance;
@end
>>>.m
#import "Tools.h"
@implementation Tools
+ (instancetype)shareInstance
{
Tools *instance = [[self alloc]init];
return instance;
}
static Tools *_instance = nil;
+ (instancetype)allocWithZone:(struct _NSZone *)zone
{
#pragma 1.當(dāng)前代碼在多線程中 可能會出現(xiàn)問題
/*
NSLog(@"%s",__func__);
// 由于所有的創(chuàng)建方法都會調(diào)用,所以只需要在愛方法中控制當(dāng)前對象 只創(chuàng)建一次即可
if (_instance == nil) {
NSLog(@"創(chuàng)建了一個對象");
_instance = [super allocWithZone:zone];
}
return _instance;
*/
// 一下代碼在多線程 也能保證執(zhí)行一次
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_instance = [super allocWithZone:zone];
});
return _instance;
}
- (id)copyWithZone:(NSZone *)zone
{
return _instance;
}
- (id)mutableCopyWithZone:(NSZone *)zone
{
return _instance;
}
#pragma mark MRC需要多處理
- (oneway void)release
{
// 為了保證整個程序過程中 只有一份實例
// 在這個方法中什么都不做
}
- (instancetype)retain
{
return _instance;
}
- (NSUInteger)retainCount
{
// return 1;
// 注意 : 為了方便程序員之間溝通,一般情況下 不會在單例中返回 retainCount = 1;
// 而是返回一個比較大的值
return MAXFLOAT;
}
@end