我编写的代码越多,迷失的就越多...因此我决定为我(和其他人)创建一个完全致力于内存管理的主题,而不是浪费时间来理解 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/