首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >什么会自动保留和释放?

什么会自动保留和释放?
EN

Stack Overflow用户
提问于 2011-06-16 20:00:33
回答 3查看 106关注 0票数 1

我有点理解什么是自动保存和释放的,但我找不到任何官方数据,我想我搞错了。

  1. 设置使用@property( object )声明的属性将保留和释放旧值,但不会在没有self.的情况下在同一个对象内设置属性
  2. 方法中的所有对象(包括参数)在创建/传递时保留,并在方法返回时释放。
  3. 方法返回的对象不会被释放,而是将由其返回的方法释放,因为它在方法中的局部变量。

我有什么不对/忘了什么吗?

当返回被丢弃时会发生什么?就像[object someMethodThatReturnsAnObject];。它将不是它返回的方法的本地的,所以我不确定它是否会被释放,并且xCode警告它。

EN

回答 3

Stack Overflow用户

发布于 2011-06-16 20:12:41

而不是猜测,阅读文件。这是确定的。

设置使用@property( retain )声明的属性将保留和释放旧值,但不会在没有self的情况下在同一个对象中设置属性。

说大也大吧。没有“设置没有自我的属性”。即直接设置实例变量。

方法中的所有对象(包括参数)在创建/传递时保留,并在方法返回时释放。

不,去看医生。

方法返回的对象不会被释放,而是将由其返回的方法释放,因为它在方法中的局部变量。

一点也不;看医生。

票数 3
EN

Stack Overflow用户

发布于 2011-06-16 20:16:43

设置使用@property( retain )声明的属性将保留和释放旧值,但不会在没有self的情况下在同一个对象中设置属性。

调用为retain属性合成的setter方法将释放旧值并保留新值。直接设置一个象牙人,而不经过你的访问者,只会分配这个象牙人。它既不会保留也不会释放任何东西。self.foo = bar正是[self setFoo:bar]。无论setFoo:做什么,都会完成(合成的setFoo:保留版本就像上面所描述的那样工作)。foo = bar正是foo = bar

方法中的所有对象(包括参数)在创建/传递时保留,并在方法返回时释放。

这根本不是事实。他们既不保留也不释放。保持和释放不是神奇的发生。这是在响应对allocnewcopyretainrelease的调用时发生的。使用点表示法只是方法调用的一个简短操作,其中可能包含一个retain

方法返回的对象不会被释放,而是将由其返回的方法释放,因为它在方法中的局部变量。

这不是真的。方法返回的对象既不保留也不释放。按照惯例,名为allocnewcopy的方法将返回net +1 retain。任何其他方法都将返回一个NET0保留计数(对象上的自动释放将与保留的数量一样多)。“当前”保留计数将始终大于0,否则无法返回对象。(这是对事实的轻微掩饰。在这两种情况下,如果存在私有保留,则保留计数可能大于1。但从调用者的角度来看,这是一种很有用的思考方法。)

最好的地方是实用内存管理,它非常简洁地展示了这一切。其余的内存管理编程指南将给出更多的例子。

票数 2
EN

Stack Overflow用户

发布于 2011-06-16 20:24:20

“自动”这个词有点吓人。这意味着,在后台运行时以某种方式神奇地应用了保留和发布。实际上,保留某物的唯一时间是发送一条包含以下内容之一的消息时:New Alloc Retain Copy (N.A.R.C)。唯一的发布时间是当它被发送到发布消息或自动释放消息时。所以你真正需要理解的是,这些方法是在什么情况下发送的?

1.设置属性

你说得对,就你所做的。为什么?因为属性只是生成getter和setter方法的语法糖。例如,self.myString = @"Foo";[self setMyString:@"Foo"]完全相同。您需要理解的是,当您声明一个具有保留语义的属性时,您实际上得到了如下所示的方法:

代码语言:javascript
复制
- (void)setMyString:(NSString *)newString {
    if ( newString != myString ) {
        [myString release];
        myString = [newString retain];
    }
}

因此,很明显,说self.myString = someOtherString将导致保留新的值。您所指的“设置没有self.的属性”实际上只是直接分配ivar。因为没有使用点运算符,也没有调用任何方法,所以您知道没有保留任何内容。

2和3.与方法范围有关的事情?

这两种说法都不是真的。按照惯例,返回我的方法的变量在名称中没有NARC的痕迹,将自动释放。这是真正遵循惯例的方法作者。任何东西都不会因为方法调用而自动保留或释放。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6377858

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档