【问题标题】:objective c setter method memory managementObjective c setter方法内存管理
【发布时间】:2010-08-21 19:38:23
【问题描述】:

我对分配和释放对象有疑问:

如果我有这样的代码:

MyObject *object = [[MyObject alloc] init];
NSMutableString *string = [[NSMutableString alloc]initWithString:@"bla"];
object.myString = string;
NSLog(@"retain count: %d",[object.myString retainCount]); //gives me 2
[string release];
NSLog(@"retain count: %d",[object.myString retainCount]); //gives me 1

比我拥有的正是我想要的。我只需要一个参考,我保留计数 1

但是

如果我使用

object.myString = [[NSMutableString alloc]initWithString:@"bla"];

我的财产如下所示:

@property (nonatomic,retain) NSMutableString *myString;

一个alloc,一个带有retain的setter方法给我作为retain count 2

如果我在辞职后释放对象,应用程序就会崩溃。不知道为什么?

那么,我是否必须始终创建一个带有临时引用的对象,而不是分配给真正的引用并像第一个代码一样释放临时引用?

或者还有其他方法吗?

【问题讨论】:

  • 您遗漏了有关如何释放 myString 以及发生崩溃的位置的详细信息,因此很难确切地说出了什么问题。从理论上讲,调用[object.myString release] 之类的东西应该没问题,但是 object.myString 总是有可能没有返回原始对象。如果您想找出原因,请使用全局断点来捕获导致您的应用程序崩溃的异常。设置“操作方法”的说明不应该太难找到。

标签: objective-c


【解决方案1】:

是的,不是的。一般来说,这是一种常见的模式:

// create the object, retain count 1
MyObject *myObject = [[MyObject alloc] init];

// increment the retain count in the setter
self.myObjectProperty = myObject;

// let go of the object before the end of the current method
[myObject release];

您可以通过使用自动释放池来避免释放。更准确地说,您表示您希望尽快释放该对象:

MyObject *myObject = [[[MyObject alloc] init] autorelease];
self.myObjectProperty = myObject;

// all done!

对于 Apple 提供的许多类,您可以使用 alloc/init 以外的类方法来获取已经自动释放的对象。您的示例可以重写为:

MyObject *myObject = [[MyObject alloc] init];
myObject.myString = [NSMutableString stringWithFormat:@"bla"];

最后一点:-retainCount 是一个钝器。特别是对于 NSStrings 和其他内置类,它可能会返回与您期望的完全不同的结果。一般来说,你应该避免它。

【讨论】:

  • 感谢您的回复。我正在使用objective-c 进行iphone 应用程序开发,这就是为什么我通常不想使用自动释放池。当我使用苹果提供的类时,我不使用发布就可以了。我真的很想知道以下代码是否可以 object.myString = [[NSMutableString alloc]initWithString:@"bla"]; [object.myString 释放];还是我需要再次释放?
  • 这个序列很好,但除非你正在制作大量的字符串或者你的应用程序是一个主要的内存占用者,否则我真的不会担心在这里和那里使用自动释放的对象。请注意,在-[MyObject dealloc] 中,您还应该拥有一个版本。如果你有,那么你已经正确地配对了你的保留和释放。
猜你喜欢
  • 1970-01-01
  • 2010-10-10
  • 2020-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多