ios - int变量的 block 和保留周期?

标签 ios objective-c block cycle

在下面的代码中,我创建了一个对 self 的弱引用以避免保留循环。好的 问题是 xCode 给了我同样的警告“在此 block 中强烈捕获 self 可能会导致保留周期”,因为“currentPage”变量是一个 int 变量。 “currentPage” 是非 objective-c 对象指针类型,怎么会导致保留周期

__weak CoresspondenceDetailsViewController *weakself = self;
[tableViewBackground.tableView addInfiniteScrollingWithActionHandler:^
 {
    [weakself getPrivateCorrespondencesForPage:currentPage];
 }

图像显示了奇怪的警告。

enter image description here

谢谢

最佳答案

答案很简单! 如果您的变量 currentPage 是 View Controller 的 ivar,那么访问该变量的实际结果将如下所示

self->currentPage

这显然会导致 self 保留。

两种可能的解决方案:

__weak CoresspondenceDetailsViewController *weakSelf = self;
int page = currentPage;
[tableViewBackground.tableView addInfiniteScrollingWithActionHandler:^
{
  CoresspondenceDetailsViewController *strongSelf = weakSelf;
  if (strongSelf) {
    [strongSelf getPrivateCorrespondencesForPage:page];
  }
}

__weak CoresspondenceDetailsViewController *weakSelf = self;
[tableViewBackground.tableView addInfiniteScrollingWithActionHandler:^
{
  CoresspondenceDetailsViewController *strongSelf = weakSelf;
  if (strongSelf) {
    [strongSelf getPrivateCorrespondencesForPage:strongSelf->currentPage];
  }
}

更新

我根据下面可爱的评论更新了代码。实际上,Apple 推荐在 block 中使用 self 的方式。

关于ios - int变量的 block 和保留周期?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20262656/

相关文章:

ios - 为什么窗口的 subview 最初定位不正确,但旋转后重新定位正确?

ios - 如何检测设备中是否配置了 Touch ID

ruby - rspec yield block ,但调用原始

html - 如何使用显示 : inline-block when resizing browser? 缩放图像

ios - subview 宽度 anchor 在 stackView 中不起作用

ios - 如何使用 AVAssetExportSession 将 wav 文件导出为 22kHz 的 m4a?

android - 移动 SDK 中的 oauth 2 实现

objective-c - 运行时编程动态方法时使用 ARC 编译时出错

iphone - 将 socket 添加到 View Controller 的最简单方法是什么?

apache-spark - 如何使用 Spark 写入 128 MB parquet 文件