CO-类的本质、description方法
類的本質(zhì)
1. 類也是個(gè)對(duì)象
- 其實(shí)類也是一個(gè)對(duì)象,是Class類型的對(duì)象,簡(jiǎn)稱“類對(duì)象”
- Class類型的定義
typedef struct objc_class ?*Class;
- 類名就代表著類對(duì)象,每個(gè)類只有一個(gè)類對(duì)象
?
2. +load和+initialize
- +load
l?? 在程序啟動(dòng)的時(shí)候會(huì)加載所有的類和分類,并調(diào)用所有類和分類的+load方法
l?? 先加載父類,再加載子類;也就是先調(diào)用父類的+load,再調(diào)用子類的+load
l?? 先加載元原始類,再加載分類
l?? 不管程序運(yùn)行過程有沒有用到這個(gè)類,都會(huì)調(diào)用+load加載
?
- +initialize
l?? 在第一次使用某個(gè)類時(shí)(比如創(chuàng)建對(duì)象等),就會(huì)調(diào)用一次+initialize方法
l?? 一個(gè)類只會(huì)調(diào)用一次+initialize方法,先調(diào)用父類的,再調(diào)用子類的
?
3. 獲取類對(duì)象的2種方式
Class c = [Person class];// 類方法?
或者
Person*p = [Person new];
Class c2 = [p class];// 對(duì)象方法
?
4. 類對(duì)象 調(diào)用類方法
Class c = [Person class]; ?
Person *p2 = [c new];
?
#import <Foundation/Foundation.h> #import "Person.h" #import "Student.h" #import "GoodStudent.h" /*1.當(dāng)程序啟動(dòng)時(shí),就會(huì)加載項(xiàng)目中所有的類和分類,而且加載后會(huì)調(diào)用每個(gè)類和分類的+load方法。只會(huì)調(diào)用一次。2.當(dāng)?shù)谝淮问褂媚硞€(gè)類時(shí),就會(huì)調(diào)用當(dāng)前類的+initialize方法3.先加載父類,再加載子類(先調(diào)用父類的+load方法,再調(diào)用子類的+load方法)先初始化父類,再初始化子類(先調(diào)用父類的+initialize方法,再調(diào)用子類的+initialize方法)*/int main() {// [[GoodStudent alloc] init];return 0; }void test1() {Person *p = [[Person alloc] init];//[Person test];// 內(nèi)存中的類對(duì)象// 類對(duì)象 == 類Class c = [p class];[c test];Person *p2 = [[c new] init];NSLog(@"00000"); }void test() {// 利用Person這個(gè)類創(chuàng)建了2個(gè)Person類型的對(duì)象Person *p = [[Person alloc] init];Person *p2 = [[Person alloc] init];Person *p3 = [[Person alloc] init];// 獲取內(nèi)存中的類對(duì)象Class c = [p class];Class c2 = [p2 class];// 獲取內(nèi)存中的類對(duì)象Class c3 = [Person class];NSLog(@"c=%p, c2=%p, c3=%p", c, c2, c3);// 類本身也是一個(gè)對(duì)象,是個(gè)Class類型的對(duì)象,簡(jiǎn)稱類對(duì)象/*利用Class 創(chuàng)建 Person類對(duì)象利用 Person類對(duì)象 創(chuàng)建 Person類型的對(duì)象*/description方法
使用場(chǎng)合:?
1.????? -description方法
使用NSLog和%@輸出某個(gè)對(duì)象時(shí),會(huì)調(diào)用對(duì)象的-description方法,并拿到返回值進(jìn)行輸出
返回: <類名: 內(nèi)存地址>
2.????? +description方法
使用NSLog和%@輸出某個(gè)類對(duì)象時(shí),會(huì)調(diào)用類對(duì)象+description方法,并拿到返回值進(jìn)行輸出
3.????? 修改NSLog的默認(rèn)輸出
l?? 重寫-description或者+description方法即可
4.????? 死循環(huán)陷阱
l?? 如果在-description方法中使用NSLog打印self
#import <Foundation/Foundation.h> #import "Person.h"void test9() {// 輸出當(dāng)前函數(shù)名NSLog(@"%s\n", __func__); }int main() {// 輸出行號(hào)NSLog(@"%d", __LINE__);// NSLog輸出C語(yǔ)言字符串的時(shí)候,不能有中文// NSLog(@"%s", __FILE__);// 輸出源文件的名稱printf("%s\n", __FILE__);test9();Person *p = [[Person alloc] init];// 指針變量的地址NSLog(@"%p", &p);// 對(duì)象的地址NSLog(@"%p", p);// <類名:對(duì)象地址>NSLog(@"%@", p);return 0; }void test2() {Class c = [Person class];// 1.會(huì)調(diào)用類的+description方法// 2.拿到+description方法的返回值(NSString *)顯示到屏幕上NSLog(@"%@", c); }void test1() {Person *p = [[Person alloc] init];p.age = 20;p.name = @"Jack";// 默認(rèn)情況下,利用NSLog和%@輸出對(duì)象時(shí),結(jié)果是:<類名:內(nèi)存地址>// 1.會(huì)調(diào)用對(duì)象p的-description方法// 2.拿到-description方法的返回值(NSString *)顯示到屏幕上// 3.-description方法默認(rèn)返回的是“類名+內(nèi)存地址”NSLog(@"%@", p);//Person *p2 = [[Person alloc] init];//NSLog(@"%@", p2);//NSString *name = @"Rose";//NSLog(@"我的名字是%@", name); Person *p2 = [[Person alloc] init];p2.age = 25;p2.name = @"Jake";NSLog(@"%@", p2); }?
?
#import "Person.h"@implementation Person// 決定了實(shí)例對(duì)象的輸出結(jié)果 //- (NSString *)description //{ // // 下面代碼會(huì)引發(fā)死循環(huán) // // NSLog(@"%@", self); // return [NSString stringWithFormat:@"age=%d, name=%@", _age, _name]; // //return @"3424324"; //}// 決定了類對(duì)象的輸出結(jié)果 + (NSString *)description {return @"Abc"; }@end?
轉(zhuǎn)載于:https://www.cnblogs.com/IDRI/p/4956369.html
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的CO-类的本质、description方法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 实战 Windows 10 Micros
- 下一篇: AlertDialog.Builder