objective-c(ios)中的基本内存管理

时间:2013-04-25 20:25:09

标签: ios objective-c memory-management

我对Objective-C和iOS开发很新,我目前正在努力掌握如何进行内存管理。我的应用程序在非ARC btw。


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

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

这个也是如此。不确定这是否是同一个问题,但在这里我不使用“和”这个词。 init之前使用它。这有什么不同吗?

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

在这种情况下,我在.h文件中定义对象并保留它。这是否意味着该变量将永远存在于内存中(当一旦被盲目初始化时),除非我释放/解除它?我想如果是这种情况,那么在卸载视图时我应该在视图中做什么?

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

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

如果这个问题很愚蠢,请耐心等待。我习惯用GC进行低级Java编程。

1 个答案:

答案 0 :(得分:6)

  

我是否需要以任何方式释放/释放此对象以在我使用它时清除它的空间,或者这是否自动完成?

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

  

这个也是如此。不确定这是否是同一个问题,但在这里我不使用“和”这个词。 init之前使用它。这有什么不同吗?

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

  

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

区分实例变量和属性。属性setter方法(如果声明为retainstrong)将保留(增加引用计数)对象。但只有在使用访问器方法时才会这样,而在直接访问实例变量时则不然。如果你写了这个:

variable = [[SomeObject alloc] init];

然后你需要释放它就像你使用任何其他(本地)变量一样:

[variable release];

如果您使用访问者方法进行设置:

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

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

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


所有这些都随着ARC的引入发生了根本性的变化,我在这里没有解释这三个原因:

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

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

  3. 这不是问题。