神一樣的存在
iOS開發(fā)中copy脊阴、retain的定義和區(qū)別
- Block 為什么使用copy
- Block在創(chuàng)建的時候默認分配的內(nèi)存在棧上克滴,而不是在堆上咱旱。使用copy將其拷貝到堆上允坚,防止在創(chuàng)建的作用域之外使用崩潰漫试。
- Block 創(chuàng)建在棧上,而Block的代碼中可能會用到本地的一些變量诡右,只有將其拷貝到堆上才能使用這些變量安岂。
- Block 為什么不適用retain
retain使用引用計數(shù)增加1,Block的內(nèi)存在棧上帆吻,不是堆上域那,可能隨時被系統(tǒng)回收,導(dǎo)致野指針存在桅锄,程序崩潰琉雳。 - 為什么Block中的對象引用計數(shù)需要自動加1
Block執(zhí)行的是回調(diào),因此Block并不知道其中的對象obj創(chuàng)建后會在什么時候釋放友瘤,為了不再Block使用object之前翠肘,對象已經(jīng)釋放,Block就retain了object一次辫秧,持有這個對象束倍。 - Block和函數(shù)的關(guān)系
- Block的理解
Block實際上是:指向結(jié)構(gòu)體的指針 - 對于基本數(shù)據(jù)
//如果需要在block中對num進行修改,需要加上關(guān)鍵字__block
//(我們也可以用static關(guān)鍵字進行修飾)
int num1 = 10;
void(^block1)() = ^{
NSLog(@"num1 is %d",num1);
};
num1 = 20;
block1();//輸出10
//改進:使用block,使進入到block塊中的變量不被當做常量來使用
__blockint num2 = 10;
void(^block2)() = ^{
NSLog(@"num2 is %d",num2);
};
num2 = 20;
block2();//輸出20