底層原始碼
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...