ios - 类方法中使用了block,如何避免循环引用?
PHP中文网
PHP中文网 2017-04-18 09:55:43
0
4
853

代码如下,在netRequestCallBack的中的使用了vc,Xcode会告警提示: 可能导致循环引用。 请问如何消除?

+ (void)JumpToMe {
    dispatch_async(dispatch_get_main_queue(), ^{
    AUIViewController *vc = [[AUIViewController alloc] init];
    vc.mainModel.netRequestCallBack = ^(NSError *error){
        [[vc navigationController] pushViewController:vc animated:YES];
    };
    [vc.mainModel sendNetworking];
    });
}

尝试:

  1. vc使用修饰词 __block,但不能解决问题,而且__block修饰后,vc仍然是强引用的。

  2. vc使用修饰词__weak,确实消除了Xcode关于循环引用的告警。但netRequestCallBack 运行时,会发现vc已经被为nil
    我理解出现这种情况,是在类方法完成后,vc没有了持有者了,也是被释放了。

所以,请问有什么方法可以解决这个吗?

PHP中文网
PHP中文网

认证0级讲师

membalas semua(4)
迷茫

Sama ada rujukan pekeliling tidak ada kaitan dengan kaedah panggilan , ia hanya berkaitan dengan hubungan rujukan.

Dalam contoh anda, gelung rujukan ialah vc --> ("-->" menunjukkan hubungan rujukan)

Prasyarat untuk objek dilepaskan ialah bahawa objek itu tidak dipegang oleh objek lain. Dalam contoh anda, vc dipegang oleh netRequestCallBack, jadi ia tidak akan dikeluarkan oleh .

Cara untuk memecahkan kitaran rujukan ialah menggunakan __lemah untuk mengisytiharkan pembolehubah yang ditangkap oleh blok.
iaitu

__weak AUIViewController *tmpVC = vc;
vc.mainModel.netRequestCallBack = ^(NSError *error){
    [[tmpVC navigationController] pushViewController:vc animated:YES];
};

Masalah dengan vc dikeluarkan ialah vc tidak dipegang oleh objek lain. Penyelesaian yang betul adalah untuk mencari vc daripada navigationController semasa atau tindanan vc lain, dan kemudian mengendalikan vc.

小葫芦

Gunakan salinan untuk atribut blok, dan kemudian tambahkan __strong __typeof(weaksSelf) strongSelf = weakSelf, tetapi logik kod anda adalah pelik

Peter_Zhu

Ubah suai blok anda dengan __strong __typeof(&*weaksSelf) strongSelf = weakSelf

小葫芦

Jangan bercakap tentang isu rujukan pekeliling

[[vc navigationController] pushViewController:vc animated:YES];

Ada masalah dengan ayat ini Jika vc tidak ditolak, adakah vc.navigationController akan menjadi Nil?

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan