2010-11-25 73 views
0

我认为我有些内存管理失踪。代码如下:发布对象的调用方法

NSString *string = @"foo"; 
[string release]; 
NSLog(@"%@", string); 

我希望得到该代码的内存错误,但代码运行没有错误。我注意到这一点,因为我正在关注一本书,并且在设置属性和添加子视图(但插入到主视图中之前)之前发布了scrollView。

我的问题是,什么时候对象真的被释放?这是否考虑了良好的编码风格?

回答

3

如果你分配,保留或复制一个对象,你有责任释放它。其他的一切都由系统处理,并且会被自动发布池刷新。

上有SO已经太多的内存管理的问题,有一个快速环顾四周,让自己熟悉https://stackoverflow.com/search?q=memory+management+iphone

[编辑] 可能是你需要了解你的问题中最重要的部分是你的倒数第二段:

I was following a book and a scrollView was released before setting properties and adding a subView (but after being inserted in the main view). 

我还没有看到这个代码,但它可能是您添加了滚动到你的UIView的实例。在这些情况下,接收视图始终保留其子视图,因此您可以自由释放它。

一旦UIView实例被释放,它也会发送一个释放消息给它的所有子视图,其中包括scrollView。

有意义吗?

+0

是的,其实我现在明白它是如何在scrollView的上下文中工作的。谢谢。 – 2010-11-25 21:57:20

5

这是可行的,因为您的string变量指向已编译到应用程序中的常量字符串。 retain它什么都不做,release它什么都不做。它存在于静态存储器中,只有当程序从内存中卸载时才会被销毁。

3

将消息发送到释放对象是未定义的行为。您可能会遇到内存错误,您最终可能会向另一个对象发送消息,最终可能会向前一个对象的幻影版本发送消息 - 这一切都取决于实现细节和运行时环境的细节不受你的控制。在这个特定的情况下,你正在运行NSString常量不变的实现细节。

至于具体何时将释放一个对象,这也是一个实现细节。如果你没有拥有一个对象,并且没有合理的保证,它仍然会在周围(例如你刚刚通过[someArrayYouOwn objectAtIndex:0]得到它),你不应该处理它。

最好的策略是:不要发送消息给你不再拥有的对象。遵循内存管理规则。