iOS複習筆記15 NSObject

2021-06-28 14:52:54 字數 3440 閱讀 7461

為了描述方便,把如下**貼出來:

@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...