日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

OC中description、 SEL、类本质、self和super用法

發布時間:2023/12/10 编程问答 53 豆豆
生活随笔 收集整理的這篇文章主要介紹了 OC中description、 SEL、类本质、self和super用法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一:description方法

description有對象方法和類方法兩種,(是NSObject類的方法)

1,-description(對象方法)

使用NSLog和@%輸出某個對象時,會調用對象的description方法,并拿到返回值進行輸出。(系統會自動調用打印對象的description方法)

而如果打印NSString對象的話,默認返回的就是NSString字符串

2,+description (類方法)

使用NSLog和@%輸出某個類時,會調用類的description類方法,并拿到返回值進行輸出。

系統默認會直接調用NSObject父類的description方法,返回對象的名和地址打印出來

所以如果我們想要打印屬性值的話就需要重寫description的方法

#import?<Foundation/Foundation.h>

@interface?Car :?NSObject

{

@public

? ??int?_lunzi;

? ??int?_seats;

? ??NSString?*_name;

}

-(void)run;

@end

@implementation?Car

-(void)run{

?? ?

? ??NSLog(@"三胖駕車跑了");

?? ?

}

//重寫父類的description方法

-(NSString?*)description{

?? ?

? ??return?[NSString?stringWithFormat:@"name:%@,lunzi:%d,seats:%d",_name,_lunzi,_seats];

?? ?

? ??//self car

? ??//return [NSString stringWithFormat:@"aaaa-%@",self];

}

?

+(NSString?*)description{

?? ?

? ??return?@"xxxx";

?? ?

}

@end

?

int?main(int?argc,?const?char?* argv[])

{

? ? ? ??Car?*car = [Car?new];

? ? ? ? car->_name?=?@"大切";

? ? ? ? car->_lunzi=?8;

? ? ? ? car->_seats=?10;

?? ? ? ?

? ? ? ??//%@?可以打印OC中的對象類型

? ? ? ??//NSString *str = @"xxxx";

? ? ? ??//注意:當我們使用%@?打印car(對象)的時候,會調用我們類的

? ? ? ??// ? ? ? ? ? ? ? ? ? ? ? -(NSString *)descrition;

? ? ? ??//

? ? ? ? Class c = [car?class];

? ? ? ??NSLog(@"\ncar:%@",car);

? ? ? ??NSLog(@"\nCar:%@",c);

? ? ? ??NSLog(@"name:%@,lunzi:%d,seats:%d",car->_name,car->_lunzi,car->_seats);

? ? ? ??return?0;

}

?

?

?

二:類的本質

? ?類本身也是一個對象,是class類型的對象,簡稱“類對象”。

Class類型的定義:?Typedef?struct?obj?class?*class;

可以看到類對象的類型為struct 0bj class * ?及指向結構體地址的指針類型 獲取內存中的類對象有兩種方法:(一個類的類對象只有一個及內存分配一個相同的空間

(1)Class?c=[p?class]; ?//指向類的對象的指針調用class方法

(2)Class?c1=[Person?class]; //使用類名調用class方法

?

類對象本質圖解:

類———————類對象-------------實例對象 在編譯時就會將類加載到代碼區 然后加載類對象到堆區 后三步為對象的加載,并且實例對象的isa指針指向類對象。類對象中isa指針指向類。(而且類對象中得SEL映射表為類中方法地址) 三:SEL:全稱Selector?表示方法的存儲位置。sel是一種數據類型,存放方法的地址,在類對象的映射表里面存放著映射關系 Person?*p=[[Person?alloc]?init];

? ? ? ? [p?test];

實例對象尋找方法的過程

1>首先將方法包裝成sel數據類型的數據 ?SEL *sel = @selector(方法名)

2>然后根據SEL找方法的地址

3>根據方法的地址調用相應的方法

4)注意:在這個操作過程中有緩存,第一次找的時候是一個一個的找,非常耗性能,之后再用到的時候就直接使用。

關于_cmd:每個方法的內部都有一個-cmd,代表著當前方法。

//SEL是一種數據類型,獲取方法的地址

SEL s1 = @selector(run); ? //取出run的地址

?[p2 performSelector:s1]; ? //間接的調用run

注意:SEL其實是對方法的一種包裝,將方法包裝成一個SEL類型的數據,去尋找對應的方法地址,找到方法地址后就可以調用方法。這些都是運行時特性,發消息就是發送SEL,然后根據SEL找到地址,調用方法。

四:self和super的用法:?

self、super是一個指針,self誰調用了當前方法,self就指向誰

而super指向了當前類的父類,如果super在類方法中,它就代表了調用當前類方法的類的父類,如果在對象方法中,它就代表調用當前對象方法的對象的父類對象

1>如果self、super在類方法中,那么它就代表當前調用這個類方法的類、父類 2>如果self在對象方法中,那么它就代表當前調用這個對象方法的對象、父對象

出現在對象方法中,就代表著當前對象,出現在類方法中,就代表著當前類】

Self、super的用途:通下

(1)可以利用self->成員變量名訪問當前對象內部的成員變量(僅在對象方法中)

(2)[self?方法名];可以調用其他的對象方法或者是類方法

轉載于:https://www.cnblogs.com/-boy/p/4069955.html

總結

以上是生活随笔為你收集整理的OC中description、 SEL、类本质、self和super用法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。