五: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的操作次...