oc中的一些常用方法

2021-07-25 02:40:30 字數 3535 閱讀 1195

-(bool) respondstoselector: selector  用來判斷是否實現了某個方法(被封裝在乙個selector的物件裡傳遞)

+(bool) instancesrespondtoselector: selector  用來判斷例項是否有以某個名字命名的方法. 和上面乙個不同之處在於, 前面這個方法可以用在例項和類上,而此方法只能用在類上.

(bool)conformstoprotocol:(protocol *)aprotocol; 是用來檢查物件(包括其祖先)是否實現了指定協議類的方法。-(id) performselector: selector  執行時呼叫某個方法(void)performselector:(sel)aselector withobject:(id)anargument afterdelay:(nstimeinterval)delay; 延時呼叫某個方法

(一)關於iskindofclass和ismemberclass的區別,在網上看到乙個很形象的例子,這裡就直接拿來用了。

這裡有兩個類,分別是繼承於nsobject的person,person的teacher

#import 

@inte***ce

person : nsobject

-(void)setname:(nsstring*)n;

@end

#import "person.h"

@implementation

person

-(void)setname:(nsstring *)n

@end

#import "person.h"

@inte***ce

teacher : person

-(void)teach;

@end

#import "teacher.h"

@implementation

teacher

-(void)teach

@end

使用iskindofclass的例子:

nsautoreleasepool *pool = [[nsautoreleasepool alloc] init];  

person *person = [[person alloc] init];

teacher *teacher = [[teacher alloc] init];

//yes

if ([teacher iskindofclass:[teacher

class]])

//yes

if ([teacher iskindofclass:[person

class]])

//yes

if ([teacher iskindofclass:[nsobject

class]])

[person release];

[teacher release];

[pool release];

輸出結果:
2012-07-04

14:34

:17.315

objectivectest

[2595:f803]

teacher 是 teacher類或teacher的子類

2012-07-04

14:34

:17.316

objectivectest

[2595:f803]

teacher 是 person類或person的子類

2012-07-04

14:34

:17.316

objectivectest

[2595:f803]

teacher 是 nsobject類或nsobject的子類

使用ismemberofclass的例子:

nsautoreleasepool *pool = [[nsautoreleasepool alloc] init];  

person *person = [[person alloc] init];

teacher *teacher = [[teacher alloc] init];

//yes

if ([teacher ismemberofclass:[teacher

class]])

//no

if ([teacher ismemberofclass:[person

class]])

//no

if ([teacher ismemberofclass:[nsobject

class]])

[person release];

[teacher release];

[pool release];

輸出結果:

2012-07-04

14:23

:07.965

objectivectest

[2460:f803]

teacher

teacher類的成員

看了這兩個例子,應該就會明白了。

(二)關於performselector呼叫和直接呼叫的區別

下面兩段**都在主線程中執行,我們在看別人**時會發現有時會直接呼叫,有時會利用performselector呼叫,今天看到有人在問這個問題,我便做一下總結,

[delegateimage**********:

self

didfinishwithimage:image];

[delegate

performselector:@selector(image**********:didfinishwithimage:)withobject:self

withobject:image];

1、performselector是執行時系統負責去找方法的,在編譯時候不做任何校驗;如果直接呼叫編譯是會自動校驗。如果image**********:didfinishwithimage

:image:

不存在,那麼直接呼叫 在編譯時候就能夠發現(借助xcode可以寫完就發現),但是使用performselector的話一定是在執行時候才能發現(此時程式崩潰);cocoa支援在執行時向某個類新增方法,即方法編譯時不存在,但是執行時候存在,這時候必然需要使用performselector去呼叫。所以有時候如果使用了performselector,為了程式的健壯性,會使用檢查方法

- (bool)respondstoselector:(sel)aselector;

2、直接呼叫方法時候,一定要在標頭檔案中宣告該方法的使用,也要將標頭檔案import進來。而使用performselector時候, 可以不用import標頭檔案包含方法的物件,直接用performselector呼叫即可。

OC一些不常用的函式

int rand 隨機數生成。intabs int a 整數的絕對值,abs 10 結果為10 double fabs double a double型別的絕對值,fabs 3.14 結果為3.140000 double fabsf float a fabsf型別的絕對值,fabsf 3.14 結果...

oc 一些常用命令

如何通過atos命令獲取64位錯誤位址的呼叫棧 對於使用arm64的ios應用,要獲取64位錯誤位址的呼叫棧,可以這麼寫 用這樣的命令來列印呼叫符號 unix指令 開啟終端,輸入指令 pwd 檢視當前資料夾路徑 cd 返回目錄 cd desktop 返回桌面 ls 開啟當前路徑下所有檔案 ls l ...

OC原始碼中的一些巨集

if define cplusplus define foundation extern extern c else define foundation extern extern endif 表示extern全域性變數,此時並沒有分配記憶體,需要在.m檔案中實現,為了支援c和c 混編 cplusp...