1. 程式人生 > >objective c 的performSelector 與block

objective c 的performSelector 與block

   //無引數
        
        -(void)noParam;
        
        //一個引數
        
        -(void)oneParam:(NSString *)oneParam;
        
        //兩個引數
        
        -(void)oneParam:(NSString *)oneParam twoParam:(NSString*)twoParam;
        
        //最多支援兩個引數
        
        
        [TestClass performSelector:@selector(noParam)];
        
        [TestClass performSelector:@selector(oneParam:)withObject:@"引數1"];
        
        [TestClass performSelector:@selector(oneParam:twoParam:)withObject:@"引數1" withObject:@"引數2"];
        
        
        
        //多引數
        
        //最多隻能支援兩個引數,因此多引數只能別想辦法
        
        //比如將引數放在陣列中,然後使用一個引數的使用方法可以實現

SEL:

1、SEL其實是對方法的一種包裝,將方法包裝成一個SEL型別的資料,去找對應的方法地址。找到方法地址就可以呼叫方法

a、把test1  test2包裝成SEL型別的資料

b、根據方法地址呼叫對應的方法

        SEL s1 = @selector(test1);
        SEL s2 = NSSelectorFromString(@"test2");//通過NSString定義SEL
        [Test performSelector:s1];
        NSString *str = NSStringFromSelector(s1); //這樣[email protected]
“test1”;

Blocks的定義以及使用:

 int (^MySum)(int, int) = ^(int a, int b) {  
            return a+b;  
        }; 
        int b = MySum(1,2);

Block可以訪問區域性變數,但是不能修改但是如果要修改就要在區域性變數前加關鍵字:__block

int a = 10;  
__block int b = 20;  
      
void (^block)();  
      
block = ^{  
NSLog(@"%d", a);    // 錯誤: block不能訪問區域性變數  
NSLog(@"%d", b);    // 正確: block可以訪問用__block修飾的區域性變數  
          
a = 100;    // 錯誤: block不能修改區域性變數的值  
b = 100;    // 正確: block不能修改用__block修飾的區域性變數的值  
}  


Block 可以使用typedef
typedef (^MySum)(int,int);  
        MySum sum;
        sum= ^(int a,int b) {  
            return a + b;  
        };

如果沒有形參括號可以省略

p.test = t;
        void (^MyBlock)() = ^{  
            NSLog(@"Block"); 
        }; 
        MyBlock();

蘋果官方建議儘量多用block,因為效率高。




相關推薦

objective cperformSelector block

//無引數 -(void)noParam; //一個引數 -(void)oneParam:(NSString *)oneParam;

Objective-C 基礎之— Block本質+源碼剖析

www IT -s 猜想 field char 源碼 等等 eof block 又稱之為“自帶變量的匿名函數”,拋開OC語法定義block的形式不談,其實好多語言都有類似的函數,比如JS的回調函數(其實就是將一個匿名還是作為函數的實參)、swift的閉

Objective-c方法學習筆記

@interface Shape : NSObject { ShapeColor fillColor; ShapeRect bounds; } - (void) setFillColor: (ShapeColor) fillColor; - (void) setB

Objective-C Block函數指針比較

其他 可執行文件 調試 objective 運行 obj 子類 函數指針 延長 相似點 1.函數指針和Block都可以實現回調的操作,聲明上也很相似,實現上都可以看成是一個代碼片段。 2.函數指針類型和Block類型都可以作為變量和函數參數的類型。(typedef定義別名

block 知識點 ---- Objective-C 高階程式設計 iOS OS X 多執行緒記憶體管理 學習筆記

1. block捕捉變數: 結論:只有呼叫_Block_copy 才能持有截獲的附有 __strong 修飾符的物件型別的自動變數值。 block 中使用物件型別的自動變數時,除以下情形,推薦使用copy方法: “When the Block is returned

Objective-C Block函式指標比較、分析

本來不應該將OC block與函式指標進行比較的,這兩者除了宣告形式上類似,都可用來實現回撥(CallBack)之外,其不同的地方會更多。 今天從一個小例子開始對Objective-C裡面函式指標和Block進行剖析。 函式指標是C語言裡面就有的,而Objec

Objective-C高階程式設計:iOSOS X多執行緒和記憶體管理

這篇文章主要給大家講解一下GCD的平時不太常用的API,以及文末會貼出GCD定時器的一個小例子。 需要學習的朋友可以通過網盤免費下載pdf版 (先點選普通下載-----再選擇普通使用者就能免費下載了)http://putpan.com/fs/cy1i1beebn7s0h4u9/ 1.G

Objective-C語言基礎總結

什麼是Objective-C Objective-C是C語言的一個超集,具有面向物件的特性,並具備了強大的執行時動態語言特性。 Objective-C的優缺點 優點: 作為C語言的超級,在C語言的基礎上衍生了很多新的語言特徵,封裝的很完善且使用方便,大大降低了程式設

Effective Objective-C 2.0 總結筆記(第二章)—— 物件、訊息、執行期

第二章:物件、訊息、執行期 ​ “物件”就是“基本構造單元”,開發者可以通過物件來儲存並傳遞資料。物件之間傳遞資料並執行任務的過程就是“訊息傳遞”。程式執行起來後,為其提供相關支援的程式碼就是“Objective-C執行期環境”,它提供了一些使得物件之間能夠傳遞訊息的重要函式,並且包括建

Effective Objective-C 2.0 總結筆記(第一章)—— 熟悉Objective-C

第一章:熟悉Objective-C ​ 本章主要是對Objective-C進行一個瞭解,通過介紹Objective-C的語法,來講解Objective-C的基礎知識。 第1條:瞭解Objective-C語言的起源 Objective-C語言採用“訊息結構”而非“函式呼叫”

Objective-C學習筆記-NSSetNSDictionary

1.NSSet與NSArray的區別就是NSSet裡面的值是不可重複且無序的,在查詢速度上NSSet比NSArray更快,而NSDictionary則可以儲存鍵值對,這個鍵值對也是無序的,鍵通常是一個字串(唯一的),而值可以是任意型別的物件 2.和NSArray一樣,N

iOS Objective-CSwift開發過程的詳細比較

前段時間,本人同時開發了兩個專案,一個用的OC,一個用的Swift。在使用中對兩種語言進行一次梳理與比較。 基礎檔案 OC Swift OC程式裡,一個類會有兩個檔案,.h和.m。.h可以寫屬性、方

Effective Objective-C 2.0 總結筆記(第三章)—— 介面API設計

第三章:介面與API設計 ​ 在開發應用程式的時候,總是不可避免的會用到他人的程式碼,或者自己的程式碼被他人所利用,所以要把程式碼寫的更清晰一點,方便其他開發者能夠迅速而方便地將其整合到他們的專案裡。 第15條:用字首避免名稱空間衝突 Objective-C

Objective-C Runtime 執行時之五:協議分類

Objective-C中的分類允許我們通過給一個類新增方法來擴充它(但是通過category不能新增新的例項變數),並且我們不需要訪問類中的程式碼就可以做到。 Objective-C中的協議是普遍存在的介面定義方式,即在一個類中通過@protocol定義介面,在另外

Objective-CJava 方法呼叫比較

Objective-C:宣告方法:-(Return-type)method:(Parameter-type)parameter1{...};多個引數時:-(Return-type)methodPart1:(Parameter-type)parameter1 methodPart2:(Parameter-typ

Swift學習之和Objective-C的聯絡區別

swfit和OC間的區別 swift句尾不需要分號 ,除非你想在一行中寫三行程式碼就加分號隔開。 swift不要寫main函式 ,程式預設從上往下執行 swift不分.h和.m檔案 ,一個類只有.swift一個檔案 swift不在有地址的概念 swift資料

Objective-cBlock

# Block 概述 標準C裡面沒有Block, C語言的後期擴充套件版本, 加入了匿名函式; C++、JS、 Swift等語言中, 有類似語法, 叫做閉包! block語法和函式指標很相似。回顧, C語言中的指標函式: c int(*) (int x,

Objective-C】類結構體的區別

只能在類裡面寫方法,不能在結構體裡面寫方法類——物件,結構體——值類——引用型別 位於棧上的指標(引用)位於堆上的實體物件結構體——值型別 例項直接位於棧中拷貝行為: classname *a = b

Objective-C Runtime 執行時之一:類物件

Objective-C語言是一門動態語言,它將很多靜態語言在編譯和連結時期做的事放到了執行時來處理。這種動態語言的優勢在於:我們寫程式碼時更具靈活性,如我們可以把訊息轉發給我們想要的物件,或者隨意交換一個方法的實現等。 這種特性意味著Objective-C不僅需要一

Objective-C Runtime 執行時之二:成員變數屬性

在前面一篇文章中,我們介紹了Runtime中與類和物件相關的內容,從這章開始,我們將討論類實現細節相關的內容,主要包括類中成員變數,屬性,方法,協議與分類的實現。 本章的主要內容將聚集在Runtime對成員變數與屬性的處理。在討論之前,我們先介紹一個重要的概念:型別