1. block
1. Block本質上是匿名函數,定義在main函數內部,和C語言的函數還是有區別的
/*
寫⼀個 返回值爲整型 參數爲OC字符串(僅一個參
數)的block,實現將字符串轉換爲整型的功能。
*/
int (^stringToInt)(NSString *) = ^(NSString *str){
return [str intValue];
};
int a = stringToInt(@"123456987654");
NSLog(@"%d",a);
2. 使用typedef定義block:
typedef int(^twoNumbers)(int ,int);
twoNumbers subValue = ^(int a, int b){
return a - b;
};
NSLog(@"%d", subValue(12, 3));
3. 在block內部可以訪問外部變量:
// 訪問外部變量:
void (^MyBlock)() = ^{
NSLog(@"%@", str);
};
MyBlock();
4. 變量地址是否相同:
// 訪問外部變量時,地址是同一個嗎:
int b = 6;
NSLog(@"外部地址:%p", &b);
void (^MyBlock)() = ^{
NSLog(@"內部地址:%p", &b);
};
MyBlock(); // 結果是:外部地址:0x7fff5fbff7ac 內部地址:0x7fff5fbff798 兩個地址不一樣
5.修改局部變量: __block
// 修改外部變量:
__block int c = 0;
twoNumbers subValue = ^(int a, int b){
c = a - b;
return c;
};
subValue(12, 3);
NSLog(@"%d", c); // 結果是:9
總結:
在block內部可以訪問外部變量,
在block內部不能修改局部變量的值,
block內部訪問變量的地址和外部變量本身的地址不一樣,相當於拷貝了一份,
如果想在block內部對外部變量進行修改:有兩種方法: ----a:將外部變量定義爲全局變量 ------b:在外部變量前加__block
2. block與數組排序:
#pragma mark--- block與數組排序
{
// 1. 第一種排序方法: 自己寫的方法 直接調用
NSArray *array = [NSArray arrayWithObjects:@"sd", @"gf", @"bgf", @"sadf", nil];
NSComparator com = ^(id str1, id str2){
return -[str1 compare:str2];
};
NSArray *sortArray = [array sortedArrayUsingComparator:com];
NSLog(@"%@", sortArray);
// 2. 第二種排序:系統的不用自己定義方法
NSArray *sortArray2 = [array sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
return [obj1 compare:obj2];
}];
NSLog(@"sortArray2:%@", sortArray2);
}
3. iOS中的字面量:
字面量是⼀種新型的寫法,能在⼀定程度上簡化代碼。
字面量創建的對象是便利構造的,且是不可變的。
例如:字典,集合,字符串,數組,等的簡單創建就是使用了字面量