block迴圈引用

2021-10-16 19:50:11 字數 4181 閱讀 3566

底層原始碼

typedef

void

(*ghblock)

(void);

struct __main_block_impl_0 };

static

void

__main_block_func_0

(struct __main_block_impl_0 *__cself)

static

void

__main_block_copy_0

(struct __main_block_impl_0*dst,

struct __main_block_impl_0*src)

static

void

__main_block_dispose_0

(struct __main_block_impl_0*src)

static

struct __main_block_desc_0 __main_block_desc_0_data =

;int

main

(int argc,

const

char

* ar**)

return0;

}

block強引用person

person強引用block

block迴圈引用解決方案:

__weak:使用弱引用解除迴圈引用,不會產生強引用,指向的物件銷毀時,會自動讓指標置為nil。

__block:此種解決方案必須要呼叫block

__unsafe_unretained:不會產生強引用,不安全,指向的物件銷毀時,指標儲存的位址值不變。

__unsafe_unretained typeof(person) weakperson = person;

原始碼

ghperson *person =

[[ghperson alloc]init]

; person.age =10;

// [person test];

// __unsafe_unretained:不會產生強引用

__unsafe_unretained typeof

(person) weakperson = person;

person.block =^;

//nslog

(@"1111111112"

);

轉換後的底層原始碼

我們可以看到,typeof (person) weakperson;這裡只是乙個型別判別,並不是向上面的ghperson *person;一樣。

typedef

void

(*ghblock)

(void);

struct __main_block_impl_0 };

static

void

__main_block_func_0

(struct __main_block_impl_0 *__cself)

static

void

__main_block_copy_0

(struct __main_block_impl_0*dst,

struct __main_block_impl_0*src)

static

void

__main_block_dispose_0

(struct __main_block_impl_0*src)

static

struct __main_block_desc_0 __main_block_desc_0_data =

;int

main

(int argc,

const

char

* ar**)

return0;

}

__block:通過呼叫block來解決迴圈方案

原始碼

__block ghperson *person =

[[ghperson alloc]init]

; person.age =10;

person.block =^;

person.

block()

;

轉換後的cpp底層**

typedef

void

(*ghblock)

(void);

struct __block_byref_person_0

;struct __main_block_impl_0 };

static

void

__main_block_func_0

(struct __main_block_impl_0 *__cself)

static

void

__main_block_copy_0

(struct __main_block_impl_0*dst,

struct __main_block_impl_0*src)

static

void

__main_block_dispose_0

(struct __main_block_impl_0*src)

static

struct __main_block_desc_0 __main_block_desc_0_data =

;int

main

(int argc,

const

char

* ar**)

;((void(*

)(id, sel,

int))(

void

*)objc_msgsend)

((id)

(person.__forwarding-

>person)

,sel_registername

("setage:"),

10);(

(void(*

)(id, sel, ghblock _nonnull))(

void

*)objc_msgsend)

((id)

(person.__forwarding-

>person)

,sel_registername

("setblock:"),

((void(*

)())

&__main_block_impl_0((

void

*)__main_block_func_0,

&__main_block_desc_0_data,

(__block_byref_person_0 *

)&person,

570425344))

);((ghblock (*)

(id, sel))(

void

*)objc_msgsend)

((id)

(person.__forwarding-

>person)

,sel_registername

("block"))

();}

return0;

}

需要注意的是:mrc環境下不支援若指標的解決方案,既不支援__weak,而且使用__block不會產生強引用。

block 迴圈引用

結論 block作為成員變數,內部引用self的成員變數,必須使用self 弱引用 block作為區域性變數,無論怎樣寫,都不會對self造成強引用 block為變數 1 block為成員變數 typedef nsstring blockcc void inte ce twoviewcontroll...

BLOCK迴圈引用

何時block才會迴圈引用 為什麼block會迴圈引用 我們很多行為會導致block的copy,而當block被copy時,會對block中用到的物件產生強引用 arc下 或者引用計數加一 mrc下 如下 property nonatomic,readwrite,copy completionblo...

block迴圈引用問題

ios開發中,開了arc模式,系統自動管理記憶體,如果程式中用到了block就要注意迴圈引用帶來的記憶體洩露問題了 這幾天遇到乙個問題,正常頁面dismiss的時候是要呼叫dealloc方法的,但是我的程式就是不呼叫,研究了好久終於找到了問題出在 了 起初的 如下 void getmyrelated...