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