基本的内存pipe理在objective-c(ios)

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


这个对象没有在代码中的任何地方声明(不是.h或者其他任何东西),而不是行belove。 我是否需要以任何方式释放/释放此对象,以便在完成使用时清除该对象的空间,或者是自动完成的?

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

这个也一样。 不知道这是否是相同的问题,但在这里我不使用之前使用它的单词和初始化。 这有什么区别?

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

在这种情况下,我在.h文件中定义对象并保留它。 这是否意味着variables将永远在内存中(当初始化一次obsly),除非我释放/释放它? 我猜如果是这样的话,这是我应该在视图卸载视图时做的事情?

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

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

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

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

由于您没有使用ARC,因此您需要手动向其发送release消息,以便处置其所有权。 (好的build议:不要用“释放内存”的方式来思考,引用计数意味着你增加和减less引用计数,你得到拥有并停止拥有对象,在失去所有引用的情况下释放对象是自动完成的,换句话说, release并不一定意味着释放。)

这个也一样。 不知道这是否是相同的问题,但在这里我不使用之前使用它的单词和初始化。 这有什么区别?

它确实。 您只拥有使用allocnewcopymutableCopy或使用retain创build的对象。 你在这里没有任何一个,所以你也不必担心释放它。 (从技术上说,这是一个自动释放的实例,将被返回,运行循环将会照顾它。)

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

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

 variable = [[SomeObject alloc] init]; 

那么你需要释放它就像你会用任何其他(本地)variables:

 [variable release]; 

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

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

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

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


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

  1. 我不是一个ARC专家,

  2. 我想鼓励您在尝试ARC之前先学习MRC(您似乎有这个打算);

  3. 这不是问题。