• Как и все локальные переменные, в стеке существует нестатический блок, который извлекается из стека, как и любая другая локальная переменная, которая не была объявлена статической.
• Block_copy () копирует блок из стека в кучу, где существуют все экземпляры malloc. И, как и все методы new / copy, Block_copy () возвращает выделенный объект кучи с счетом сохранения 1. Блок - это объектjectiveC, но он не соответствует, как обычный объект. Следовательно, не должно быть никакой разницы между Block_Release () и методом объективного выпуска.
• В этом примере используется метод копирования экземпляра блока. Потому что присвоение результата Block_copy () идентификатору требует приведения типа, который я не хочу ошибаться. Метод копирования позволяет назначать переменную блока непосредственно идентификатору.
- (void) setupStoredBlock
{
int zStackLocalVariable = 42;
iHeapAllocatedVariable = [^int(int aMore){ return zStackLocalVariable + aMore; } copy];
}
• Объявление статического объекта означает, что он должен быть физически выделен вместе с самим кодом. Блок, который объявлен как статический, запрещает компилятору доступ к переменным вне его собственной области видимости. Из-за требований объявления статического блока я предполагаю, что блок в стеке несколько отличается от блока в куче.
• Блок - это объект-объект c, чей класс, имя класса и другую связанную информацию которого я еще не пытался получить, но, подобно протоколу, объекту и другим скрытым классам targetC, он не соответствует NSObject. Однако, как и все объекты targetC, он должен соответствовать для сохранения / освобождения. ARC расширяет функции сохранения и освобождения также и для базовых объектов Foundation, и, возможно, если не сейчас, то, в конечном итоге, в распределениях malloc / free.
• Я жду истинную мотивацию для тщательного изучения mikeash.com , поскольку яблоко любит держать нас всех на каком-то гипертеоретическом плане небольшого физического значения, хотя все, что важно, это физическое .
ARC и блоки также обсуждаются здесь