gpt4 book ai didi

iphone - Objective-C (iPhone) ivars 和内存管理

转载 作者:搜寻专家 更新时间:2023-10-30 19:53:01 25 4
gpt4 key购买 nike

我正在子类化 NSURLConnection,并使用 MGTwitterEngine 作为基础来帮助我入门。这可能无关紧要。但是,我注意到在他们的代码中他们没有使用 @property@synthesize 作为他们的 ivar。他们将 ivars 包装在访问器方法中,如下所示:

- (NSString *)identifier {
return [[_identifier retain] autorelease];
}

我的问题分为两部分。首先,retain后接autorelease有什么作用?在我看来它会取消自己,或者更糟的是泄漏。

其次,如果我要将头文件更改为:

@property (nonatomic, retain, readonly) NSString* _identifier;

并且使用了@synthesize indentifier = _identifier,这不是不需要写它就可以做与访问器方法相同的事情吗?

也许这只是做同一件事的两种不同方式。但我想确保我有正确的理解。谢谢。

最佳答案

使用@synthesize 实际上只会创建一个setter 和一个getter 方法。自动为您生成的代码保证使用正确的内存管理,因此您无需担心。

MGTwitterEngines 使用 return [[ivar retain] autorelease] 实际上是正确的方法。让我们举两个例子。

假设一个 getter 定义如下:

-(Foo)foo {
return foo;
}

然后我们执行这段代码:

  1. bar = [[bar alloc] init];//bar 的保留计数为 1。
  2. foo = bar.foo;//foo 的保留计数为 1(由 bar 拥有)。
  3. [bar release];//Bar 和它的所有 ivars 立即发布!
  4. [foo doSomething];//这将崩溃,因为上一行释放了 foo。

如果我们改为将 getter 更改为:

-(Foo)foo {
return [[foo retain] autorelease];
}
  1. bar = [[bar alloc] init];//bar 的保留计数为 1
  2. foo = bar.foo;//foo 的保留计数为 2(一个由 bar 拥有,1 个由 autorelease 池拥有)。
  3. [bar release];//Bar 和它的所有 ivars 立即发布!
  4. [foo doSomething];//不会崩溃,因为 foo 仍然存在并且由自动释放池拥有。

希望这能解释为什么您应该始终从所有 getter 返回正确的自动释放对象。重要的是,任何返回值都可以在其父级的释放后继续存在,因为没有类 ca 保证一旦它暴露在野外,客户端将如何处理它的值。

关于iphone - Objective-C (iPhone) ivars 和内存管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4008940/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com