2012-01-16 39 views
1

Objective-C中的塊變量是一個引用,我從某處推斷出下面的代碼可能會被編譯器轉換爲另一種形式。功能塊的生命週期?

原始代碼:

typedef int (^block_type)(); 
block_type create_k(int i) 
{ 
    block_type block = ^(){ 
     return i; 
    }; 
    //[block copy]; 
    return block; 
} 

生成的代碼:

typedef void (*generic_invoke_funcptr)(void *, ...); 
struct __block_literal { 
    void *isa; 
    int flags; 
    int reserved; 
    generic_invoke_funcptr invoke; 
    struct __block_descriptor_tmp *descriptor; 
    const int captured_i; 
}; 
static const struct __block_descriptor_tmp { 
    unsigned long reserved; 
    unsigned long literal_size; 
    /* no copy/dispose helpers needed */ 
} __block_descriptor_tmp = { 
    0UL, sizeof(struct __block_literal) 
}; 
// ^int (void) { return i; } 
int __create_k_block_invoke_(struct __block_literal *bp) { 
    return bp->captured_i; 
} 
typedef int (*iv_funcptr)(struct __block_literal *); 

typedef int (^block_type)(); 
block_type create_k(int i) 
{ 

    //block_type block = ^(){ 
    // return i; 
    //}; 
    struct __block_literal __b = { 
     .isa = &_NSConcreteStackBlock, 
     .flags = BLOCK_HAS_DESCRIPTOR, 
     .reserved = 0, 
     .invoke = (generic_invoke_funcptr)__f_block_invoke_, 
     .descriptor = &__block_descriptor_tmp, 
     .captured_i = i 
    }; 
    struct __block_literal *block = &__b; 
    return block; 
} 

所以| _ C |在堆棧和塊中只是對|的引用 _b |。如果| create_k | return | block |,接收者只會得到一個無效的地址。

int main(int argc, const char *argv[]) 
{ 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 

    printf("%d\n", create_k(40)()); 
    [pool drain]; 
    return 0; 
} 

執委會它,打印| 40 |和| block |是一個有效的塊。怎麼了?

回答

1

我的猜測是該堆棧幀的內存還沒有被清零。嘗試調用create_k()和printf()之間的另一個函數來獲取其他一些隨機數據。