objective-c - 关于 Objective-C 属性语法的基本问题

标签 objective-c cocoa cocoa-touch

我有几个关于 Objective C 中属性的语法和用法的基本问题:

假设标题中有以下声明:

@interface TestObject : NSObject {

    NSArray *myArray;
}

@property (nonatomic, retain) NSArray *myArray;

在实现中,我可以:

  1. 列表项
  2. 交替使用 myArrayself.myArray 来设置和获取目的?
  3. self.myArray = nil 是否等同于[myArray release]
    如果是这样,是否有理由使用 self.myArray = nil 而不是 [myArray release]

最佳答案

  1. myArrayself.myArray实际上是不同的。 myArray正在直接访问变量,而 self.myArray (相当于 [self myArray] )正在调用访问器方法。大多数人同意您应该使用 self.myArray (或 [self myArray] ),永远不要使用 myArray直接地。这是因为访问器可能有副作用;例如,如果您直接设置变量,KVO 将无法工作,并且不会为您处理内存管理。

  2. 您的属性(property)声明为 retain , 所以 self.myArray = anArray (与 [self setMyArray:anArray] 相同)执行以下操作:

    1. 保留一个数组,它很快就会成为新的 myArray。
    2. 释放旧的 myArray,它很快就不再是 myArray。
    3. 更改指针 myArray,使其现在指向 anArray。

因此,当您执行 self.myArray = nil ,其中一个步骤 (#2) 确实是释放旧数组。 (因为新的是 nil,我们不必担心它的内存管理,即使我们保留了它。)所以是的,self.myArray = nil是释放 myArray 的有效方式.

但是,如果您正在谈论发布 myArraydealloc , 通常使用 [myArray release] 是个好主意, 因为调用 self.myArray = nil如果有任何其他对象正在观察,将会产生副作用 myArray通过 KVO。因此,虽然它确实遵循内存管理标准,但编写您的 dealloc 并不是一个好主意。使用 self.myArray = nil 的方法.

关于objective-c - 关于 Objective-C 属性语法的基本问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2426849/

相关文章:

ios - 为什么这个 UIButton 图像不会显示在自定义 UITableViewCell 中?

macos - 如何在 OSX 中跨多个屏幕全屏运行

iphone - Coredata iPhone 到 iPad/Mac 是否支持 iCloud?

ios - 两级详细 View 的 TableView 中 TableView 的替代方法

ios - 从书面数字中获取一个整数

ios - 如何使用 WatchKit 服务证书?

ios - FBWebDialogs 添加本地镜像到参数

objective-c - 滚动到底部时向 UITableView 添加行

cocoa - 如何使用 NSIndexSet

ios - 删除 dealloc 上对象的所有观察信息