Bên trong Block_copy()
không thực sự có liên quan ở đây. Những gì bạn muốn theo dõi là liệu một khối đã cho tồn tại trên ngăn xếp hay trên vùng heap. Xem xét mã này dựa trên ví dụ của bạn:
@interface Foo : NSObject
@end
@implementation Foo
typedef void(^BlockTypedef)(void);
+(void)doSomethingElseWithBlock:(BlockTypedef)block
{
NSLog(@"block=%@", block);
BlockTypedef myBlock = Block_copy(block);
NSLog(@"myBlock=%@", myBlock);
myBlock();
Block_release(myBlock);
}
+(void)doSomethingWithBlock:(BlockTypedef)block
{
[Foo doSomethingElseWithBlock:^() {
block();
}];
}
@end
int main (int argc, const char * argv[])
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
int i = 3;
BlockTypedef block = ^{ printf("i=%d\n", i); };
NSLog(@"block=%@", block);
[Foo doSomethingWithBlock:block];
block();
NSLog(@"block=%@", block);
[pool drain];
return 0;
}
Điều này sẽ ổn, nhưng block
và myblock
là các loại khối khác nhau. block
là một khối ngăn xếp và có phạm vi của ngăn xếp cuộc gọi. Nó sẽ tồn tại cho đến khi thoát main()
. myblock
là một khối malloc (heap), và sẽ tồn tại cho đến khi nó được phát hành. Bạn cần đảm bảo rằng bạn không cố gắng lấy một tham chiếu không được sao chép sang block
và sử dụng nó sau khi hoàn tất ngăn xếp. Bạn không thể dán block
vào một thanh ivar mà không cần sao chép nó.
Joachim Bengtsson có cách viết tốt nhất về điều này mà tôi biết. @bbum cũng đã viết về nó. (Nếu bbum đi lang thang ở đây và nói rằng tôi là một thằng ngốc về điều này, sau đó nghe anh ta, nhưng tôi nghĩ rằng tôi đang ở đây.)
Nguồn
2011-06-21 06:47:32
Bạn hãy thử nó? –
Ứng dụng của tôi không phải là đặc biệt runnable tại thời điểm này, do đó, không có. Tôi đã tìm thấy điều này: http://clang.llvm.org/docs/Block-ABI-Apple.txt Có nội dung "Các khối có thể chứa các biểu thức chữ. Mọi biến được sử dụng trong các khối bên trong được nhập vào tất cả các khối kèm theo phạm vi ngay cả khi các biến không được sử dụng. Điều này bao gồm nhập khẩu const cũng như các biến __block. " Tuy nhiên, trong trường hợp này nó là một khối chữ có chứa một khối, không phải thứ tự được đưa ra ở đó. –