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用法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PSFTP上传文件到服务器
- 下一篇: lucene 入门整理