Dấu "^" là để khai báo 1 block, chính là 1 con trỏ hàm.
Cách sử dụng
- Hàm bình thường:
Mã:
void printMessage (void) {
NSLog (@"Programming is fun.");
}
- Block giống chức năng với function trên
Mã:
^(void) {
NSLog (@"Programming is fun.");
}
- Block được gán vào 1 tên biến
Mã:
void (^printMessage)(void) = ^(void){
NSLog (@"Programming is fun.");
};
- Gọi:
- Block gần giống như 1 hàm nên cũng có giá trị trả về:
Mã:
int (^gcd) (int, int) = ^(int u, int v){
int temp;
while ( v != 0 ) {
temp = u % v; u = v;
v = temp;
}
return u;
};
- Block tiện hơn hàm ở chổ có thể viết bên trong hàm, ngoài hàm, locally hoặc globally
Mã:
#import <Foundation/Foundation.h>
// Block to calculate the nth triangular number
void (^calculateTriangularNumber) (int) = ^(int n) {
int i, triangularNumber = 0;
for ( i = 1; i <= n; ++i )
triangularNumber += i;
NSLog (@"Triangular number %i is %i", n, triangularNumber);
};
int main (int argc, char *argv[]) {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
calculateTriangularNumber (10);
calculateTriangularNumber (20);
calculateTriangularNumber (50);
[pool drain];
return 0;
}
- Block có thể truy nhập các biến bên trong phạm vi (scope) block được khai báo, chỉ truy nhập, không thể sửa đổi:
Mã:
#import <Foundation/Foundation.h>
int main (int argc, char *argv[]) {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
int foo = 10;
void (^printFoo)(void) = ^(void) {
NSLog (@"foo = %i", foo); };
foo = 15;
printFoo ();
[pool drain];
return 0;
}
Cuốn programming in objective-c 2.0 nói rất rõ vấn đề này.
Bạn nên tìm đọc để hiểu rõ hơn.
Chúc thành công.
Thông qua phân tích dữ liệu Google từ 86 quốc gia, mới đây, một công ty tại Anh đã công bố bảng xếp hạng kích tấc "cậu nhỏ" của các nước trên thế giới. Kết quả, hầu hết các nước xếp ở nhóm đầu của...
"Chim" của chàng trai Việt thuộc...