基本的内存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
并不一定意味着释放。)
这个也一样。 不知道这是否是相同的问题,但在这里我不使用之前使用它的单词和初始化。 这有什么区别?
它确实。 您只拥有使用alloc
, new
, copy
, mutableCopy
或使用retain
创build的对象。 你在这里没有任何一个,所以你也不必担心释放它。 (从技术上说,这是一个自动释放的实例,将被返回,运行循环将会照顾它。)
在.m文件中,我将分配和使用这个对象,就像在第一个或第二个案例(似乎没有任何区别)。
区分实例variables和属性。 属性setter方法(如果声明为retain
或strong
)将保留(增加对象的引用计数)。 但是,只有在使用访问器方法时才是如此,而不是在直接访问实例variables时。 如果你写这个:
variable = [[SomeObject alloc] init];
那么你需要释放它就像你会用任何其他(本地)variables:
[variable release];
如果您使用访问器方法来设置它:
self.variable = [[[SomeObject alloc] init] autorelease];
那么你在创build时必须使用autorelease
(否则它的引用计数为2,你会泄漏内存)。
在这两种情况下,你也可以使用self.variable = nil;
放弃所有权。 这只适用于属性。
所有这些都随着ARC的引入而发生了根本性的变化,这里我不解释三个原因:
-
我不是一个ARC专家,
-
我想鼓励您在尝试ARC之前先学习MRC(您似乎有这个打算);
-
这不是问题。