1

我对 Objective-C 和 iOS 开发还很陌生,我目前正在尝试掌握如何进行内存管理。顺便说一句,我在非 ARC 中的应用程序。


除了 belove 行之外,该对象未在代码中的任何位置(不是 .h 或任何内容)中声明。当我完成使用它时,我是否需要以任何方式释放/释放该对象以清除它的空间,还是自动完成?

NSMutableURLRequest *restRequest = [[NSMutableURLRequest alloc] init];

这个也是一样。不确定这是否是同一个问题,但在这里我在使用它之前不使用 alloc & init 这两个词。这有什么区别吗?

NSString *postLength = [NSString stringWithFormat:@"%d", [postData length]];

在这种情况下,我在 .h 文件中定义对象并保留它。这是否意味着除非我释放/释放它,否则该变量将始终在内存中(当初始化一次时)?我想如果是这样的话,当视图被卸载时我应该在视图中做些什么?

@interface Storeage : NSObject {
    NSString *deviceToken;
}
@property (nonatomic, retain) NSString *deviceToken;

在 .m 文件中,我将像在第一种或第二种情况下一样分配和使用这个对象(似乎没有任何区别)。

如果这个问题很愚蠢,请多多包涵。我习惯于使用 GC 进行低级 Java 编程。

4

1 回答 1

6

当我完成使用它时,我是否需要以任何方式释放/释放该对象以清除它的空间,还是自动完成?

由于您没有使用 ARC,因此您需要手动向其发送release消息以处置其所有权。(好建议:不要考虑“释放内存”。引用计数意味着您增加和减少引用计数,您可以拥有和停止拥有对象,在失去所有引用后释放对象是自动完成的。换句话说,release并不一定意味着释放。)

这个也是一样。不确定这是否是同一个问题,但在这里我在使用它之前不使用 alloc & init 这两个词。这有什么区别吗?

确实如此。您只拥有使用allocnewcopy创建mutableCopy或使用 引用的对象retain。你在这里什么都不做,所以你也不必担心释放它。(从技术上讲,它是一个自动释放的实例,会被返回,运行循环会处理它。)

在 .m 文件中,我将像在第一种或第二种情况下一样分配和使用这个对象(似乎没有任何区别)。

区分实例变量和属性。属性设置方法,如果声明为retainor strong,将保留(增加引用计数)您的对象。但这仅在您使用访问器方法时才是正确的,而不是在您直接访问实例变量时。如果你这样写:

variable = [[SomeObject alloc] init];

那么您需要像使用任何其他(本地)变量一样释放它:

[variable release];

如果你使用访问器方法来设置它:

self.variable = [[[SomeObject alloc] init] autorelease];

那么你必须autorelease在创建它时使用(否则它的引用计数为 2,你会泄漏内存)。

在这两种情况下,您还可以使用self.variable = nil;来放弃所有权。这仅适用于属性。


随着 ARC 的引入,这一切都发生了根本性的变化,出于三个原因,我在这里不做解释:

  1. 无论如何,我都不是 ARC 专家。

  2. 我想鼓励您在尝试 ARC 之前完美地学习 MRC(您似乎有意);

  3. 这不是问题所在。

于 2013-04-25T20:31:20.887 回答