Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Однако если же послать блоку 'copy', то блок переместится в кучу (__NSMallocBlock__)Он точно переместится? Вроде бы copy должен копировать?
typedef void (^EmptyBlock)();
void foo(EmptyBlock block) {
NSLog(@"my class:%@, my ptr %p", [block class], &block);
block = [block copy];
NSLog(@"my class:%@, my ptr %p", [block class], &block);
}
int main(int argc, const char * argv[]) {
@autoreleasepool {
int a = 1;
foo(^{
int b = a;
});
}
return 0;
}
Блок создает внутри себя константные локальные переменные и указатели того, что захватывает. Что при использовании объектов увеличит счетчик ссылок, по обычной для ARC логике (при копировании блока в кучу).
typedef int (^EmptyBlock)();
void foo(EmptyBlock block) {
EmptyBlock mallocBlock = block;
EmptyBlock mallocBlock1 = block;
NSLog(@"my class:%@, ptr block = %p", [mallocBlock class], mallocBlock);
NSLog(@"my class:%@, ptr block = %p", [mallocBlock1 class], mallocBlock1);
}
int main(int argc, const char * argv[]) {
@autoreleasepool {
int a = 1;
foo(^int{
return a+5;
});
}
return 0;
}
Objective-C: как работают блоки