//
// Dog.h
// IOS150616_ObjectiveC_選擇器
//
// Created by qianfeng on 15/6/16.
// Copyright (c) 2015年 Peng Junlong. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface Dog : NSObject
@property (copy)NSString *name;
@property (assign,nonatomic)NSInteger age;
- (void)bark:(NSNumber*)count andBark:(NSString *)str;
- (void)eat:(NSString *)food;
@end
//====
// Dog.m
// IOS150616_ObjectiveC_選擇器
//
// Created by qianfeng on 15/6/16.
// Copyright (c) 2015年 Peng Junlong. All rights reserved.
//
#import "Dog.h"
@implementation Dog
- (void)bark:(NSNumber *)count andBark:(NSString *)str
{
int cot = [count intValue];
for (int i=0; i<cot; i++) {
NSLog(@"汪");
}
NSLog(@"%@",str);
}
- (void)eat:(NSString *)food
{
NSLog(@"%@",food);
}
@end
//
// main.m
// IOS150616_ObjectiveC_選擇器
//
// Created by qianfeng on 15/6/16.
// Copyright (c) 2015年 Peng Junlong. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "Dog.h"
//**************************
//* 選擇器 *
//**************************
//函數指針變量
int add(int a, int b)
{
return a+b;
}
int main(int argc, const char * argv[]) {
@autoreleasepool {
int (*pfunc)(int,int) = add;
NSLog(@"add = %d",pfunc(3,6));
Dog *xiaoHua = [[Dog alloc] init];
[xiaoHua eat:@"魚"];
//選擇器:運行時的概念,只有在運行的時候纔會判斷聲明的方法是否實現,編譯時是無法判斷的
//1.利用@selector關鍵字生成選擇器,SEL是一個指針類型,select是指向bark:方法的地址
#pragma clang diagnostic ignored "-Warc-performSelector-leaks" // 該語句可以去除調用performSelector方法時的警告
//方法一:
//利用方法名:
SEL select = @selector(bark:andBark:); //兩個參數的選擇器
SEL select1 = @selector(eat:); //一個參數的選擇器
//方法二:
//利用方法名的字符串對象生成選擇器
//SEL select = NSSelectorFromString(@"bark:");
//方法三:
//利用C語言的字符串生成選擇器
//SEL select = sel_getUid("bark:");
//獲取選擇器中保持的方法名
NSLog(@"%s",sel_getName(select));
NSLog(@"%@",NSStringFromSelector(select));
NSLog(@"select = %p",select);
//判斷選擇器中的方法是否實現
//編譯器只編譯.h文件中聲明的方法,不編譯.m文件,所以要進行判斷
if ([xiaoHua respondsToSelector:select]) {
//執行選擇器中保存的方法;
[xiaoHua performSelector:select withObject:[NSNumber numberWithInt:10] withObject:@"叫的很happy"]; //若之傳入一個參數,則第二個參數使用前一個參數
}
if ([xiaoHua respondsToSelector:select1]) {
[xiaoHua performSelector:select1 withObject:@"豬肉"];
}
}
return 0;
}