我所读到的有关 Objective-C 内存管理的所有内容都让它听起来非常简单。套用每个人的话:“释放你分配、保留或复制的任何东西”。但我认为还有一些更具体的案例并不是那么明确。以下是一些示例情况。每个的正确程序是什么:
情况 #1:
Foo *foo = [[foo alloc] init];
Foo *fooToo = [[[foo alloc] init] autorelease];
foo = fooToo;
foo 在分配给 fooToo 之前是否需要释放?
情况#2 当我做这样的事情时,我似乎遇到了很多崩溃: (.h 和 .m 为了方便混在一起)
Foo *foo;
@property (nonatomic, retain) Foo *foo;
@synthesize foo;
-(id)init{
self = [super init];
}
-(void)dealloc{
[super dealloc];
[foo release];
}
我经常被告知“总是在 dealloc 中释放你设置的保留属性”。但如果像我展示的那样完成,这将崩溃。
情况#3 同样会崩溃的类似情况: (.h 和 .m 为了方便混在一起)
Foo *foo;
@property (nonatomic, retain) Foo *foo;
@synthesize foo;
-(id)init{
self = [super init];
self.foo = nil;
}
-(void)dealloc{
[super dealloc];
[foo release];
}
出于某种原因,当我的代码执行 dealloc 时,foo 不是 == nil。
情况 #4 最后,只是一个问题,人们在两者之间做出决定时使用的一般思维过程是什么
self.foo = bar;
和
foo = bar;
当 foo 声明为与上述情况相同时? self.foo
只是另一种编码方式吗:
foo = [bar retain]
;
最佳答案
情况#1:
是的,您确实需要在失去对它的引用之前释放 foo
。鉴于您分配了它,您有责任释放它。如果你在释放它之前重新分配 foo
,你就不能再释放它了!
情况#2:
dealloc
的正确实现是:
- (void)dealloc {
[foo release];
[super dealloc];
}
dealloc
方法需要调用 super 的 dealloc
方法而不是 release
方法。另外,调用[super dealloc]
情况#3: 与情况 #2 相同。
情况#4:
我总是喜欢使用 self.foo = bar
,因为如果需要,它会自动执行以下步骤:
- 释放
foo
- 保留
条
- 将
foo
分配给bar
赋值 foo = bar
和 foo = [bar retain]
不会释放 foo
的前一个对象。
关于objective-c - 更具体、通用的 Objective-C 内存管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1610361/