objective-c - 更具体、通用的 Objective-C 内存管理

标签 objective-c memory-management

我所读到的有关 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,因为如果需要,它会自动执行以下步骤:

  1. 释放foo
  2. 保留
  3. foo 分配给 bar

赋值 foo = barfoo = [bar retain] 不会释放 foo 的前一个对象。

关于objective-c - 更具体、通用的 Objective-C 内存管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1610361/

相关文章:

objective-c - 在 Swift 中将 id 转换为 objective-c 定义的协议(protocol)

ios - -(Class)class 是什么意思?

iphone - 启动画面图像的方向不正确

objective-c - 为什么将任何选择器发送到 Nil 对象什么都不做,但将 "invalid"选择器发送到任何 NSObject 会引发异常?

java - Enum#values() 是否在每次调用时分配内存?

c# - 跟踪 GPU 内存泄漏的专业方法(分配而不释放)

objective-c - Core Data 中对多关系的属性声明

android - 在 android 中使用 malloc/free

c++ - C++ 中高效的数组重分配

ios - 内存管理何时使用release