我正在浏览斯科特·史蒂文森(Scott Stevenson)维护的精彩博客,我试图理解一个基本的Objective-C概念,即为代表分配"分配"属性与"保留".请注意,在垃圾收集环境中,这两种方法是相同的.我最关心的是一个非基于GC的环境(例如:iPhone).

直接来自斯科特的博客:

assign关键字将生成一个setter,该setter直接将值分配给实例变量,而不是复制或保留它.这最适用于NSInteger和CGFloat等基本类型,或您不直接拥有的对象,如委托

不直接拥有委托对象意味着什么?我通常会保留我的代表,因为如果我不想让他们陷入深渊,retain会帮我解决这个问题.我通常将UITableViewController从其各自的数据源和委托中抽象出来.我还保留了那个特定的对象.我想确保它永远不会消失,这样我的UITableView就会一直有它的委托.

有人能进一步解释一下我哪里错了吗?为什么我错了?这样我就可以理解Objective-C2.0编程中使用委托的赋值属性而不是保留的这种常见范例了吗?

谢谢!

推荐答案

避免保留委派的原因是需要避免保留循环:

A创建B A将自己设置为B的代表 … A是由它的所有者释放的

如果B保留了A,A不会被释放,因为B拥有A,因此A的dealloc永远不会被调用,导致both A and B泄漏.

你不应该担心A会消失,因为它拥有B,因此会在go 配售中摆脱它.

Ios相关问答推荐

AlGolia InstantSearch Swift Package Manager引发编译错误

SwiftUI中的视频时间轴

创建带有Flutter 翼的会所头像

如何在react 本机模块中使用Bundle.main.Path()在SWIFT中导入assets资源

如何在SwiftUI中以一定Angular 绘制直线(&A)

以编程方式更改VC&39;S导航栏按钮的属性,以响应另一个VC中的按钮按下

RxSwift:如何使用另外两个可观测对象(其中一个依赖于另一个)创建可观测对象?

XcodeCloud生成失败,返回";ci_pre_xcodeBuild.sh是可执行文件,但退出时返回2个退出代码.";

使用 Objective-C 创建 iOS 框架

NavigationLink 只能在文本部分点击

叠加视图不在堆栈中维护自身 - SwiftUI

DateFormatter 使用 TimeZone 和 Locale 的特定组合返回 nil

Flutter 错误:CocoaPods not installed or not in valid state.

为什么我的应用在 Testflight 中没有下载 dSYM 按钮?

Xcode 4.1 致命错误:自构建预编译头文件后修改了 stdlib

是否可以在 iOS 9 上让您的 iPad 应用退出多任务处理?

如何缩小 UIImage 并使其同时变得清晰/锐利而不是模糊?

判断密钥是否存在于 NSDictionary 中

Select 器touchesBegan:withEvent:的覆盖方法具有不兼容的类型(NSSet,UIEvent)->()

单击 GoogleSignIn 按钮时应用程序崩溃