20150616選擇器

//
//  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;
}


發佈了71 篇原創文章 · 獲贊 0 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章