OC語法 2 2 記憶體管理 手動記憶體管理2

2021-06-27 11:53:50 字數 3941 閱讀 4172

五:copy語法                                         

這篇建議學過foundation框架之後再學習

本小節知識點:

①:基本用法 1:

乙個物件可以使用

copy

或者mutablecopy

方法來建立物件的副本,當我們操作副本的時候不影響原物件

2:copy-

需要先實現

nscopying

協議,建立的是不可變副本(如:

nsstring,nsarray,nsdictionary);

3:mutablecopy-

需要先實現

nsmutablecopying

協議,建立的是可變副本(如:

nsmutablestring,nsmutablearray,nsmutabledictionary);

4:深拷貝:內容拷貝,源物件和副本指向的是不同的兩個物件,源物件引用計數器不變,副本引用計數器設定為1;

5:潛拷貝:指標拷貝,源物件和副本指向的是同乙個物件,物件的引用計數器

+1,其實相當於做了一次

retain操作

6:只有不可變物件建立不可變副本(

copy

)才是淺拷貝,其他都是深拷貝

②:為自定義類新增複製功能

1:如果想自定義

copy,

那麼就必須遵守

nscopying,

並實現copywithzone:方法

2:如果想自定義

mutablecopy,

那麼就必須遵守

nsmutablecopying,

並實現mutablecopywithzone:方法

3:以copy

為例,建議用

[self class]

代替直接類名

-(id)copywithzone:(nszone *)zone

下面是各種拷貝的**示例:

#import #import "student.h"

#pragma mark 以可變字串拷貝為例,深拷貝

//深拷貝: 內容拷貝,會產生新的物件,新的物件計數器為1,源物件不變

void stringmutablecopy()

#pragma mark 字串的拷貝:淺拷貝

void stringcopy()

#pragma mark 可變字串的拷貝(深拷貝)

void mutablestringcopy()

#pragma mark 可變字串的nsmutablecopy(深拷貝)

void mutablestringmutablecopy()

#pragma mark student的name的copy

void studentnamecopy()

#pragma mark student的拷貝

void studentcopy()

int main(int argc, const char * argv)

return 0;

}

student的.m檔案

#import "student.h"

@implementation student

+(id)studentwithname:(nsstring *)name

// copying協議的方法

- (id)copywithzone:(nszone *)zone

-(void)setname:(nsstring *)name

}-(void)dealloc

-(nsstring *)description

@end

student的.h檔案

#import @inte***ce student : nsobject//copy 代表release舊物件,copy新物件

//修改外部的變數並不會影響內部的成員變數

//建議:nsstring 一般用copy 策略,其他物件一般用retain

@property(nonatomic,copy)nsstring *name;

+(id)studentwithname:(nsstring *)name;

- (id)copywithzone:(nszone *)zone;

@end

六:autorelease的基本概念

本節知識點:

1:autorelease

方法的作用就是將物件放入到池子中,然後返回乙個

self

指標(就是說池子裡面放的也是物件的位址),並不會將

retaincount

馬上-1

;2:注意autoreleasepool的作用域,當這個池子被銷毀的時候,放入裡面的所有物件都進行一次release操作,乙個物件就是放進去兩次,也會對應的釋放兩次

詳細內容示例見下面**:

#import #import "person.h"

#pragma - mark autorelease基本概念

#pragma mark 測試一

void test1()

//代表池子被銷毀了,對池子中所有物件進行一次release操作

}#pragma mark 測試二

void test2()

}#pragma mark 測試三

void test3()

}#pragma mark 測試四

void test4 ()

nslog(@"456");

}#pragma mark 測試五

void test5()

//會在這個地方被釋放

}}int main(int argc, const char * argv) //會在執行到這一步顯示物件被銷毀了

}//會在這一步報錯,野指標操作

return 0;

}

七:autorelease的應用

本小節知識點:

當我們即想建立乙個物件,但是不能馬上release,並且又想呼叫這個物件的方法的時候,我們就需要再類方法,或者物件方法中用到autorelease

我們建立乙個廚師物件,建立乙個食物物件,並且廚師有乙個類方法,有乙個物件方法,詳細**如下:

main 函式

#import #import "chief.h"

#import "food.h"

int main(int argc, const char * argv)

return 0;

}

廚師的.h和.m檔案

#import #import "food.h"

@inte***ce chief : nsobject

+(chief *)chief;

-(food *)makefood;

@end

#import "chief.h"

@implementation chief

+(chief *)chief

-(food *)makefood

-(void)dealloc

@end

食物的.h和.m檔案

#import @inte***ce food : nsobject

@property(nonatomic,retain)nsstring *name;

@end

#import "food.h"

@implementation food

-(void)dealloc

@end

OC 手動記憶體管理

一.為什麼要進行記憶體管理 建立乙個oc物件 定義乙個變數 呼叫乙個函式或者方法 二.oc中的記憶體管理是管理的記憶體中的哪一部分 我們知道 記憶體分為五大區域 棧區,堆區,資料去,bss段,區。而最後三者是在程式啟動時由作業系統進行控制的,所以不需要我們管理。棧區儲存的也都是已經初始化的基本資料型...

OC基礎 手動記憶體管理

建立物件 1.分配記憶體空間,儲存物件 2.初始化成員變數 3.反回物件的指標位址 1.物件在完成建立的同時,內部會自動建立乙個引用計數器,這個計數器,是系統用來判斷是否 物件的唯一依據,當我們的引用計數 retaincount 0 的時候,系統會毫不猶豫 當前物件 2.物件release reat...

Oc 記憶體管理

1 對你自己擁有的物件負責,你只能釋放你擁有的物件 2 凡是你通過 retain alloc copy等手段獲得了所有者的物件,都必須在你不使用的時候來呼叫release autorelease等手段來釋放對他的所有權 3 在一定的 段內,對同乙個物件所作的copy alloc retain的操作次...