1.
block中相互引用問題解決方案:
__weak
thirdviewcontroller
*weakself =
self;
__weak
typeof
(self
) weakself =
self;
2. 為什麼block使用copy而不用strong
@property
(nonatomic
,copy
)void
(^block)();
或者set方法中_block
= [block
copy];
因為block變數預設是宣告為棧變數(建立時在棧區分配的記憶體),為了能夠在block的宣告域外使用,所以要把block拷貝(copy)到堆,所以說為了block屬性宣告和實際的操作一致,最好宣告為copy。
使用完 [block
copy
]後列印結果如下:
<__nsstackblock__: 0x7fff5fbff728> ,
<__nsmallocblock__: 0x100115b10>
3.block外的區域性遍歷可以直接使用 但是其實是block自己複製了乙個常量在使用 此時這個常量不能修改值 會報錯
nsinteger
thenum =10;
void (^myblock)() = ^;
4.在block中想修改外部變數的值 直接修改會報錯 要使用__block修飾
__block
intt =20;
//告訴編譯器
block
會修改這個值
void
(^change)(
void
) = ^(
void);
5.mrr情況下使用block的記憶體管理:
使用以下函式 retain realease
block_copy
(self
.block
);
block_release
(self
.block);
6.block導致的相互引用中就算是(使用self的_index屬性)或者(呼叫self的方法)也會導致迴圈引用 如果強行用 可以使用強指標再指向這個弱指標
OC中的block的用法總結
1.block 的基本概念 了解 block是乙個型別,可以定義變數,它的變數是用來存 塊.2.block的基本用法 固定寫法牢記 block最簡單形式 定義格式 void block名 使用格式 block名 定義是,把block當初資料型別 特點 1,型別比函式定義多了乙個 2.設定數值,有乙個...
OC中的Block 塊語法 相關知識
block的資料型別格式 返回值型別 引數型別1 引數名1,引數型別2 引數名2,注 1.沒有引數 括號不能省略 2.引數名可以省略,特殊情況下,為了方便使用,不省略 block賦值 實現 格式 資料型別1 引數名,資料型別2 引數名2,注 1.引數名不能省略 2.如果block有返回值,需要使用r...
OC中的Block,多型
首先我們來找一下每個區域內的記憶體位址 棧int a 10 nslog p a 堆 int p malloc 40 nslog p p 全域性靜態區 static int b 10 nslog p b 常量區 常量字串,儲存的是首位址 char str iphone nslog p str 區 ns...