為了描述方便,把如下**貼出來:
@inte***ce student:nsobject
-(void)go;
-(void)showname:(nsstring *)name;
-(void)introduce:(nsstring *)name :(nsstring*)address;
@end
student* stu = [[student alloc]init];
一 建立和初始化方法
alloc
allocwithzone
newcopy -- 只有不可變到不可變是淺拷貝(相當於retain),其他都是深拷貝,產生不可變的副本(nsstring, nsset等)
mutablecopy -- 深拷貝,產生可變的副本(nsmutablstring, nsmutablset等)
init
重點看copy和mutablecopy
copy:只有不可變到不可變是淺拷貝(相當於retain),其他都是深拷貝,產生不可變的副本(nsstring, nsset等)
mutablecopy:深拷貝,產生可變的副本(nsmutablstring, nsmutablset等)
並不是所有的物件都支援copy,mutablecopy;
遵守nscopying/nsmutablecopying協議的類可以傳送copy/mutablecopy訊息。
這兩個協議裡面分別宣告了下面兩個方法:
- (id)copywithzone:(nszone *)zone;
- (id)mutablecopywithzone:(nszone *)zone;
示例:
@inte***ce student:nsobject @end
@inte***ce student
(id)copywithzone:(nszone *)zone
@end
二 記憶體管理方法retain 增加物件的計數器retaincount 返回乙個物件當前的計數器release 減少物件的計數器autorelease 自動減少物件的計數器,但是以推遲的方式來實現。dealloc 應用於類來釋放物件例項變數並釋放動態記憶體三 判斷方法iskindofclass:判斷物件是否是某個類或子類的物件ismemberofclass:判斷物件是否是某個類的物件comfirmstoprotocal:判斷物件是否實現了某個協議instancesrespondtoselector:判斷物件是否實現了某個方法respondstoselector:判斷類是否實現了某個方法四 間接呼叫performselector:performselector:withobjct:performselector:withobjct:withobjct:performselector:withobjct:afterdelay:// 相當於[stu go];
[stu performselector:@selector(go)];
// 相當於[stu showname:@"jun"];
[stu performselector:@selector(showname:) withobjct:@"jun"];
相當於[stu introduce:@"jun":@"address"];
[stu performselector:@selector(introduce::) withobjct:@"jun" withobjct:@"address"];
// 延時2秒之後呼叫
[stu performselector:@selector(showname:) withobjct:@"jun" afterdelay:2];
五 描述
nsobject有乙個description方法
+ (nsstring *)description;
當我們呼叫nslog(@"%@", instance);時,就會呼叫description方法。
自定義類時,可以重寫這個方法。
六 反射
根據字串反射成類和方法
1 class反射
// 字串類名到類
nsstring* classname = @"student";
class class = nsclassfromstring(classname);
person* p = [[class alloc] init];
// 類到字串類名
nsstring* strclass = nsstringfromclass([person class]);
2 方法反射
// 字串方法名到方法
nsstring* funname = @"go";
sel selector = nsselectorfromstring(funname);
[stu performselector:selector];
// 方法到字串方法名
nsstring* strfun = nsstringfromselector(selector);
七 nsobject本質
@inte***ce nsobject
可以看到nsobject物件只有乙個成員變數class isa;
class又是什麼呢?
typedef struct objc_class *class;
它結構體objc_class指標的別名。
objc_class的定義如下:
struct objc_class ;
跟nsobject定義類似,此外還有id也是這樣的。
typedef struct objc_object *id;
所以id就是結構體objc_object指標。
從上面可以看出,nsobject,objc_class,objc_object都僅有乙個objc_class * 型別,也就是class型別的變數isa
以得出結論,類是用objc_class結構體表示的,物件是用objc_object結構體表示的,物件的isa用來標示這個物件是哪個類的例項。
看下面的源**:
- (bool)ismemberofclass:(class)cls
- (class)class
class object_getclass(id obj)
static inline class _object_getclass(id obj)
如果obj不空,返回的class型別就是obj->isa,否則,返回的是nil。
這就從原始碼上證實了isa就是代表乙個物件的型別。
iOS複習筆記10 使用Block
功能 儲存一段 可以在任何時間執行。標誌 跟函式類似 1 可以儲存一段 2 有返回值 3 有形參 4 呼叫方式 變數宣告 更函式指標變數類似 返回值型別 變數名 引數型別列表 typedef 返回值和引數一致的block可以typedef為同一種型別 許可權 block內部可以訪問外面的變數 但是,...
iOS複習筆記12 分類
1 功能描述 1.1 向已經存在的類中新增方法,不能新增成員變數。1.2 將類的實現放到不同的檔案中 1.3 建立對私有方法的引用 2 格式 標頭檔案 檔名 類名 類別名.h import 類名.h inte ce 類名 類別名 新方法的宣告 end 原始檔 檔名 類名 類別名.m import 類...
iOS複習筆記5 記憶體管理之set方法
1 alloc和release成對出現 2 set方法 2.1 基礎型別直接賦值 2.2 oc物件 判斷不等 retain新的,釋放舊的,再賦值 3 dealloc方法 3.1 一定要呼叫 super dealloc 且放在最後 3.2 self擁有的物件要做一次release inte ce bo...