gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 04:02:56 25 4
gpt4 key购买 nike

我有几个关于 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com