oc踩過的一些循環(huán)引用坑

1、注冊、移除Notification

????????- (void)viewWillAppear:(BOOL)animated {

? ????????? ????????[super viewWillAppear:animated];

? ????????? ????????[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(test) name:@"test" object:nil];

????????}

????????- (void)viewWillDisappear:(BOOL)animated {

? ????????? ????????[super viewWillDisappear:animated];

? ????????? ????????[[NSNotificationCenter defaultCenter] removeObserver:self name:@"test" object:nil];

? ? ? ? ? ?}

????????????就是在頁面出現(xiàn)的時候注冊通知,頁面消失時移除通知。你這邊可要注意了,一定要成雙成對出現(xiàn),通過指定的 name 移除通知,如果你只在viewWillAppear 中 addObserver沒有在viewWillDisappear 中 removeObserver那么當(dāng)消息發(fā)生的時候,你的方法會被調(diào)用多次。

2、在block中調(diào)用其它方法

改前:

????????__weak typeof(self)weakself = self;

????????[[BluetoothUtil sharedInstance] simpleGetBLEStateWithBlock:^(NSString *stateString) ?{

????????????????dispatch_async(dispatch_get_main_queue(), ^{? ? ? ? ? ?

????????????????????????[weakself BLEStartScan];? ? ? ? ? ? ?

????????????????});

????????}];

????????- (void)BLEStartScan ?{

? ????????????????? __weak typeof(self) weakSelf = self;

????????}

????????block中調(diào)用self方法時需要把weaksekf也傳遞到方法中

????????改后:

????????__weak typeof(self)weakself = self;

????????[[BluetoothUtil sharedInstance] simpleGetBLEStateWithBlock:^(NSString *stateString) ?{

????????????????dispatch_async(dispatch_get_main_queue(), ^{? ? ? ? ? ?

????????????????????????[weakself BLEStartScan:weakself];? ? ? ? ? ? ?

?????????????????});

????????}];

????????- (void)BLEStartScan:(BindDeviceVC *)uself ?{

????????????????__weak typeof(self) weakSelf = uself;

????????}

3、在block中不能自己引用自己

????????[self.bridge registerHandler:@"unKnowTypeToQuestion" handler:^(id data, WVJBResponseCallback ????responseCallback) {

????????????????dispatch_async(dispatch_get_main_queue(), ^{

????????????????????????[WKWebVC showWithContro:self withUrlStr:homeUrl withTitle:title];

????????????????});

????????}];

????????在block中不能自己引用自己,所以block中WKWebVC需要改為HJWebVC(隨意一個別的);

weakself問題,不能使用self

????????改后:

????????[self.bridge registerHandler:@"unKnowTypeToQuestion" handler:^(id data, WVJBResponseCallback responseCallback) {

????????????????dispatch_async(dispatch_get_main_queue(), ^{

????????????????????????[HJWebVC showWithContro:weakself withUrlStr:homeUrl withTitle:title];

????????????????});

????????}];

4、__weak和__block

????????在cellForRowAtIndexPath中:

????????改前:

????????__block CommentInBelieveCell *cellBlock = cell;

????????cell.zanBlock = ^{

????????};

????????__weak使用有問題

????????__weak和__block

????????__weak 主要用于防止block中的循環(huán)引用

????????__block用于修飾某些block內(nèi)部將要修改的外部變量

????????改后:

????????_weak CommentInBelieveCell *cellBlock = cell;

????????cell.zanBlock = ^{

????????};

5、cellForItemAtIndexPath中block中使用cell

????????- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {

????????????????cell.buttonBlock = ^{

????????????????????????[collectionView reloadData];

?????????????????};

????????}

????????其中cell和collectionView循環(huán)引用

????????改后:

????????- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {

?????????????????__weak typeof(self)weakSelf = self;

????????????????cell.buttonBlock = ^{

????????????????????????[weakSelf.collectionView reloadData];

????????????????};

????????}

????????- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{

????????????????cell.selectBlock = ^{

????????????????????????[tableView reloadData];

????????????????};

????????}

????????其中cell和tableView循環(huán)引用

????????改后:

????????- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{

????????????????__weak typeof(self)weakSelf = self;

? ? ? ? ? ? ? ? ?cell.selectBlock = ^{

? ? ? ? ? ? ? ? ? ? ? ? ? ?[weakSelf.tableView reloadData];

?????????????????};

? ? ? ? ? ?}

6、block中使用項(xiàng)目中自定義的log

????????#define STLog(...) NSLog(@"%s(%p) %@", __PRETTY_FUNCTION__, self, [NSString stringWithFormat:__VA_ARGS__])

????????block和self循環(huán)調(diào)用

????????block中不使用STLog,必須使用觀察數(shù)據(jù)的話使用NSLog

7、AFNetworking中,manage接收到請求結(jié)果后需要

????????__weak typeof(manager) weakManager = manager;

????????[weakManager invalidateSessionCancelingTasks:YES resetSession:YES];

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對...
    cosWriter閱讀 11,650評論 1 32
  • 設(shè)計(jì)模式是什么? 你知道哪些設(shè)計(jì)模式,并簡要敘述? 設(shè)計(jì)模式是一種編碼經(jīng)驗(yàn),就是用比較成熟的邏輯去處理某一種類型的...
    iOS菜鳥大大閱讀 809評論 0 1
  • 1.設(shè)計(jì)模式是什么? 你知道哪些設(shè)計(jì)模式,并簡要敘述? 設(shè)計(jì)模式是一種編碼經(jīng)驗(yàn),就是用比較成熟的邏輯去處理某一種類...
    司馬DE晴空閱讀 1,466評論 0 7
  • 1.設(shè)計(jì)模式是什么? 你知道哪些設(shè)計(jì)模式,并簡要敘述?設(shè)計(jì)模式是一種編碼經(jīng)驗(yàn),就是用比較成熟的邏輯去處理某一種類型...
    龍飝閱讀 2,302評論 0 12
  • 愛你所愛,行你所行,聽從你心,不忘西東。 一開始看到無問西東這幾個字的時候,還以為是關(guān)于佛法禪宗的故事。請?jiān)徫覜]...
    jenny211閱讀 255評論 0 2

友情鏈接更多精彩內(nèi)容