iphone - 保留、分配、属性...让您的 Obj-c 生活更轻松的主题!

标签 iphone nsarray equals allocation retain

我编写的代码越多,迷失的就越多...因此我决定为我(和其他人)创建一个完全致力于内存管理的主题,而不是浪费时间来理解 obj-c 基础知识...我会当提出新问题时更新它!

好的,下面是一些示例:

// myArray is property (retain)
myArray = otherArray;

//myArray isn't a property
myArray = otherArray;

//myArray is a property (retain)
myArray = [[NSArray alloc] init];

//myArray isn't a property
myArray = [[NSArray alloc] init];

--- 所以,如果我理解......当你放置 self.myArray 时,你告诉 Xcode 使用 getter 或 setter,但是当你只执行 myArray 时,你要对一切负责,对吗?

[已解决] UPDATE1:之间有区别吗:

//myArray is a property
myArray = otherArray; // it is only a reference, releasing otherArray will imply releasing myArray
self.myArray = otherArray; // otherArray is sent a retain message so releasing otherArray will still keep myArray in memory

--- 是的,有区别(参见上面的评论)

[已解决]更新2:下面的 myArray 是否等于 nil ?

NSArray *myArray;

--- Kubi:是的,它等于 nil。

[已解决] UPDATE3:它算作 2 次保留吗?一种从 self 保留,一种从 alloc 保留?这是内存泄漏吗?

self.myArray = [[NSArray alloc] init];

--- Kubi:是的,这是内存泄漏!

[已解决]更新4:属性(property)负责一切?不需要分配或释放?

self.myArray = [NSArray array];

--- 我们这里使用 setter 以便正确保留数组

[已解决]更新5:这两个 block 相同吗?

//myArray is a retained property

self.myArray = [NSArray array]; //retain
self.myArray = nil; //release and set to nil

myArray = [[NSArray alloc] initWithArray]; //retain
self.myArray = nil; //release and set to nil

--- Kubi:是的,它们是相同的

感谢您抽出时间。

戈蒂耶。

最佳答案

首先,我假设您有一个名为 myArray 的属性和一个名为 myArray 的 iVar?如果是这样,情况 1,2 是相同的,并且 3,4 是相同的。如果您需要设置当前类的属性,则必须通过以下方法之一来完成:

self.myArray = otherArray;
[self setMyArray:otherArray];

myArray = otherArray 只会设置 iVar,而不会设置属性。

第二部分,您询问内存管理。第一步:阅读Apple's Guide 。这确实是必读的。如果您不完全理解,请不要担心,每月继续阅读一次,它最终会变得清晰。

第二步:记住这条经验法则:如果您分配复制新建保留一个对象,你有责任释放该对象,如果你不释放,它就会被泄漏。

在所有其他情况下,您不负责释放该对象,但它最终会被释放。如果您需要保留它,则需要保留它(当然,稍后再释放它)。

回到您的示例,在前两种情况下,如果您不保留 myArray ,它将在此代码块之后的某个时刻释放。如果您稍后尝试向该对象发送消息,则会收到错误消息。在后两种情况下,如果您在某个时刻不释放 myArray 对象,它将被泄漏。

<小时/>

更新 1 差别很大。这两行完全不同。关于点语法要认识到的重要一点是这两行完全等效:

self.myArray = otherArray;
[self setMyArray:otherArray];

注意第二行是方法调用。理论上你可以在该方法中放入任何你想要的东西。您可以将 myArray 设置为 nil,或将其设置为 someOtherArray,或者更新 twitter 或其他内容。

<小时/>

更新2 是的,Obj-C 中的指针被初始化为 nil。

<小时/>

更新3 确切地。如果 myArray 属性声明为 retain 并且您使用默认合成器,则会导致内存泄漏。

更新5 也完全正确。

关于iphone - 保留、分配、属性...让您的 Obj-c 生活更轻松的主题!,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2496477/

相关文章:

iphone - Google Analytics for iOS 中仅显示部分 View

iphone - 特定索引后升序

ios - NSMutable 数组返回无法识别的值

c# - IStructuralEquatable 与等于?

java - Java 中不可修改的集合相等性

iphone - UIView类中addSubview和insertSubview的区别

iphone - 编辑时如何更改 UITextField 中的颜色

iphone - 如何从 NSMutableArray iPhone 应用程序中查找特定对象?

cocoa - 使用 nspredicate 使用字典过滤数组失败

c# - 类型安全的 Equals()