blocks 學習)

來源:互聯網
上載者:User

Ios4已經直接支援blocks,很有必要學習一下。

在ios,blocks是對象,它封裝了一段代碼,這段代碼可以在任何時候執行。Blocks可以作為函數參數或者函數的傳回值,而其本身又可以帶輸入參數或傳回值。它和傳統的函數指標很類似,但是有區別:blocks是inline的,並且它對局部變數是唯讀。

Blocks的定義:

  int (^Multiply)(int, int) = ^(int num1, int num2) {return num1 * num2;};

定義了一個Multiply的blocks對象,它帶有兩個int參數,返回int。等式右邊就是blocks的具體實現,注意{}blocks體裡的;。

Blocks可以訪問局部變數,但是不能修改。

int multiplier = 7;int (^myBlock)(int) = ^(int num) {     multiplier ++;//編譯報錯     return num * multiplier;};

 

如果要修改就要加關鍵字:__block

__block int multiplier = 7;int (^myBlock)(int) = ^(int num) {    multiplier ++;//這樣就可以了    return num * multiplier;};

作為函數的參數,blocks某種意義上替代了回呼函數或者delegate。當函數調用了,假設某個事件觸發,這時blocks裡的內容就會運行。這樣有利於代碼的整合和閱讀,你不需要到處去實現委託方法了。

系統API中已經有很多支援blocks參數了

  • Completion handlers
  • Notification handlers
  • Error handlers
  • Enumeration
  • View animation and transitions
  • Sorting

例如:

[UIView animateWithDuration:(NSTimeInterval)duration animations:(void (^)())animations]

集合體中也可以運用blocks。枚舉一個數組時我們通常:

for (id obj in Array);

現在,

NSString *area = @"Europe";NSArray *timeZoneNames = [NSTimeZone knownTimeZoneNames];NSMutableArray *areaArray = [NSMutableArray arrayWithCapacity:1];NSIndexSet *areaIndexes = [timeZoneNames         indexesOfObjectsWithOptions:NSEnumerationConcurrent      passingTest:^(id obj, NSUInteger idx, BOOL *stop) {     NSString  *tmpStr = (NSString *)obj;     return [tmpStr hasPrefix:area];}]; NSArray *tmpArray = [timeZoneNames objectsAtIndexes:areaIndexes];[tmpArray enumerateObjectsWithOptions:NSEnumerationConcurrent|NSEnumerationReverse usingBlock:^(id obj, NSUInteger idx, BOOL *stop) {[areaArray addObject:[obj substringFromIndex:[area length]+1]]; }];NSLog(@"Cities in %@ time zone:%@", area, areaArray);    

在blocks中obj就是數組中的每個成員,我們就可以在blocks內對每個對象進行處理。再比如:

NSMutableArray *mArray = [NSMutableArray arrayWithObjects:@"a",@"b",@"abc",nil];NSMutableArray *mArrayCount = [NSMutableArray arrayWithCapacity:1];[mArray enumerateObjectsWithOptions:NSEnumerationConcurrent usingBlock: ^(id obj,NSUInteger idx, BOOL *stop){[mArrayCount addObject:[NSNumber numberWithInt:[obj length]]];}];NSLog(@"%@",mArrayCount);

你會發現,這樣寫代碼更容易讀懂。

最後,看一個排序的例子:

    NSArray *stringsArray = [NSArray arrayWithObjects:                             @"string 1",                             @"String 21",                             @"string 12",                             @"String 11",                             @"String 02", nil];    static NSStringCompareOptions comparisonOptions = NSCaseInsensitiveSearch | NSNumericSearch |    NSWidthInsensitiveSearch | NSForcedOrderingSearch;    NSLocale *currentLocale = [NSLocale currentLocale];    NSComparator finderSort = ^(id string1, id string2) {    NSRange string1Range = NSMakeRange(0, [string1 length]);    return [string1 compare:string2 options:comparisonOptions range:string1Range locale:currentLocale];    };    NSLog(@"finderSort: %@", [stringsArray sortedArrayUsingComparator:finderSort]);

結果:finderSort: (

    "string 1",

    "String 02",

    "String 11",

    "string 12",

    "String 21"

)

原文出自http://www.cnblogs.com/scorpiozj/articles/1941006.html

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.