objective-c - Objective-C 中的标准对象初始化不会导致内存泄漏吗?

标签 objective-c memory-leaks

在 Objective-C 中创建对象的标准方法如下所示:

MyClass* object = [[MyClass alloc] init];

MyClassinit 方法的标准实现看起来像这样:

-(id) init
{
    self = [super init];
    if(self) { /* initialize */ }
    return self;
}

除了一些语法更改和排除工厂方法之外,这似乎是编写和使用 init 方法的推荐方式。

据我了解,self = [super init]; 的目的是处理[super init] 失败的情况。但是如果真的失败了,返回nil,那岂不是内存泄露了?原因是 MyClass 的 init 将返回 nil,object 将是 nil,将不再有指针引用用 [MyClass alloc] 分配的对象,因此无法释放它。

这是我能想到的两种解决方案,但我在常规实践中都没有见过。

调用 alloc 后,在调用 init 之前检查结果:

MyClass* object = [MyClass alloc];
if(object == nil) { /*handle the error */ }
else { object = [object init]; }

或者,如果[super init] 失败,释放内存。像这样:

-(id) init
{
    id temp = [super init];
    if(!temp) { [self release]; }
    self = temp;
    if(self) { /* initialize */ }
    return self;
}

我的推理有错吗?可以说 [super init] 不太可能失败,但是为什么要将它的结果分配给 self 并检查 nil?我很乐意看到一些说明。

最佳答案

如果 [super init] 想要返回 nil,它也应该在自身上调用 release

关于objective-c - Objective-C 中的标准对象初始化不会导致内存泄漏吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4083654/

相关文章:

objective-c - 什么是 "non-weak zeroing reference"

ios - Soundcloud:当从另一个 View Controller 呈现时,SCLoginViewController 与状态栏重叠

objective-c - 给定一个具有可选一对一关系的 NSManagedObject,我如何检查它们是否为空?

c++ - 使用 std::string 隐式构造 NSString

objective-c - @synchronized block 是否保证释放它们的锁?

c - Valgrind 内存泄漏报告中的时间戳不正确

php - Doctrine 2.1 : memory usage increased after flush

python - MySQLdb - 游标 - 内存泄漏?

c - 使用后释放内存

java - 了解 Jeprofile 输出