一来涨、關(guān)于performSelector調(diào)用和直接調(diào)用區(qū)別
- 下面兩段代碼都在主線程中運(yùn)行,我們在看別人代碼時(shí)會發(fā)現(xiàn)有時(shí)會直接調(diào)用,有時(shí)會利用performSelector調(diào)用,今天看到有人在問這個(gè)問題陶贼,我便做一下總結(jié)
[delegate imageDownloader:self didFinishWithImage:image];
[delegate performSelector:@selector(imageDownloader:didFinishWithImage:)withObject:self withObject:image];
-
1、performSelector是運(yùn)行時(shí)系統(tǒng)負(fù)責(zé)去找方法的待秃,在編譯時(shí)候不做任何校驗(yàn)拜秧;如果直接調(diào)用編譯是會自動校驗(yàn)。如果imageDownloader:didFinishWithImage:image:不存在章郁,那么直接調(diào)用 在編譯時(shí)候就能夠發(fā)現(xiàn)(借助Xcode可以寫完就發(fā)現(xiàn))枉氮,但是使用performSelector的話一定是在運(yùn)行時(shí)候才能發(fā)現(xiàn)(此時(shí)程序崩潰);Cocoa支持在運(yùn)行時(shí)向某個(gè)類添加方法暖庄,即方法編譯時(shí)不存在聊替,但是運(yùn)行時(shí)候存在,這時(shí)候必然需要使用performSelector去調(diào)用培廓。所以有時(shí)候如果使用了performSelector惹悄,為了程序的健壯性,會使用檢查方法
- (BOOL)respondsToSelector:(SEL)aSelector;
2肩钠、直接調(diào)用方法時(shí)候泣港,一定要在頭文件中聲明該方法的使用,也要將頭文件import進(jìn)來价匠。而使用performSelector時(shí)候当纱, 可以不用import頭文件包含方法的對象,直接用performSelector調(diào)用即可踩窖。
二惫东、Objective-C中一種消息處理方法performSelector: withObject:
Objective-C中調(diào)用函數(shù)的方法是“消息傳遞”,這個(gè)和普通的函數(shù)調(diào)用的區(qū)別是,你可以隨時(shí)對一個(gè)對象傳遞任何消息廉沮,而不需要在編譯的時(shí)候聲明這些方法颓遏。所以O(shè)bjective-C可以在runtime的時(shí)候傳遞人和消息。
簡單的消息(方法)
#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
[self performSelector:@selector(fooNoInputs)];
}
- (void) fooNoInputs {
NSLog(@"Does nothing");
}
@end
在消息(方法)中傳遞一個(gè)參數(shù)
#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
[self performSelector:@selector(fooOneIput:) withObject:@"first"];
}
- (void)fooOneIput:(NSString*) parameter1 {
NSLog(@"%@", parameter1);
}
@end
在消息(方法)中傳遞兩個(gè)參數(shù)
#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
[self performSelector:@selector(fooFirstInput:secondInput:) withObject:@"first" withObject:@"second"];
}
- (void) fooFirstInput:(NSString*) parameter1 secondInput:(NSString*) parameter2 {
NSLog(@"%@ %@", parameter1, parameter2);
}
@end