我对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编程。
答案 0 :(得分:6)
我是否需要以任何方式释放/释放此对象以在我使用它时清除它的空间,或者这是否自动完成?
由于您未使用ARC,因此需要手动向其发送release
消息以便处置其所有权。 (好的建议:不要考虑“释放内存”。引用计数意味着你增加和减少引用计数,你拥有并停止拥有对象,在丢失所有引用时重新分配对象自动完成。换句话说,release
并不一定意味着重新分配。)
这个也是如此。不确定这是否是同一个问题,但在这里我不使用“和”这个词。 init之前使用它。这有什么不同吗?
确实如此。您只拥有使用alloc
,new
,copy
,mutableCopy
或使用retain
引用创建的对象。你不在这里做任何一个,所以你也不必担心释放它。 (从技术上讲,它是一个将被返回的自动释放的实例,运行循环将处理它。)
在.m文件中,我会像第一种或第二种情况一样分配和使用这个对象(似乎没有任何区别)。
区分实例变量和属性。属性setter方法(如果声明为retain
或strong
)将保留(增加引用计数)对象。但只有在使用访问器方法时才会这样,而在直接访问实例变量时则不然。如果你写了这个:
variable = [[SomeObject alloc] init];
然后你需要释放它就像你使用任何其他(本地)变量一样:
[variable release];
如果您使用访问者方法进行设置:
self.variable = [[[SomeObject alloc] init] autorelease];
然后你必须在创建它时使用autorelease
(否则它的引用计数为2,你会泄漏内存)。
在这两种情况下,您还可以使用self.variable = nil;
放弃所有权。 这仅适用于媒体资源。
所有这些都随着ARC的引入发生了根本性的变化,我在这里没有解释这三个原因:
无论如何,我不是ARC专家;
我想鼓励你在尝试ARC之前完全学习MRC(你似乎有意);
这不是问题。