Objective c 什么会自动保留和释放?

Objective c 什么会自动保留和释放?,objective-c,reference-counting,Objective C,Reference Counting,我有点了解什么是自动保留和释放的,但我找不到任何官方数据,我想我搞错了 设置用@property(retain)声明的属性将保留和释放旧值,但不在没有self的情况下设置同一对象内的属性。 方法中的所有对象(包括参数)在创建/传递时保留,在方法返回时释放 方法返回的对象不会被释放,而是由其返回的方法释放,因为它的局部变量在方法中 我做错什么了/忘了什么吗? 当退货被丢弃时会发生什么?比如[objectsomemethodthattreturnsanobject]。它对于返回的方法不是本地的,所以

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

  • 设置用@property(retain)声明的属性将保留和释放旧值,但不在没有
    self的情况下设置同一对象内的属性。
  • 方法中的所有对象(包括参数)在创建/传递时保留,在方法返回时释放
  • 方法返回的对象不会被释放,而是由其返回的方法释放,因为它的局部变量在方法中 我做错什么了/忘了什么吗?
    当退货被丢弃时会发生什么?比如
    [objectsomemethodthattreturnsanobject]。它对于返回的方法不是本地的,所以我不确定它是否会被释放,xCode会发出警告。

    而不是猜测。这是确定的

    设置声明的属性 使用@property(retain)将保留和 释放旧值,但不释放设置 同一对象中的属性 没有自我

    有点。没有“设置没有自我的属性”。即直接设置实例变量

    方法内的所有对象(包括 参数)在 当 方法返回

    没有;见文件

    由方法返回的对象 不会被释放,而是会被释放 由返回的方法释放 由于其局部变量位于 方法

    一点也不;查看文档。

    不要猜测。这是确定的

    设置声明的属性 使用@property(retain)将保留和 释放旧值,但不释放设置 同一对象中的属性 没有自我

    有点。没有“设置没有自我的属性”。即直接设置实例变量

    方法内的所有对象(包括 参数)在 当 方法返回

    没有;见文件

    由方法返回的对象 不会被释放,而是会被释放 由返回的方法释放 由于其局部变量位于 方法

    一点也不;见文件

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

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

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

    这根本不是事实。它们既不保留也不释放。保留和释放不会神奇地发生。它一方面响应对
    alloc
    new
    copy
    retain
    release
    的调用。使用点表示法只是方法调用的简写,方法调用中可能包含
    retain

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

    事实并非如此。方法返回的对象既不会被保留也不会被释放。按照惯例,名称中带有
    alloc
    new
    copy
    的方法将返回net+1 retain。任何其他方法都将返回净0保留计数(对象上的自动删除数与保留数相同)。“当前”保留计数将始终大于0,否则无法返回对象。(这稍微掩盖了事实真相。如果存在私人保留,则任何情况下的保留计数都可能大于1。但从调用方的角度来看,这是一种有用的思考方式。)

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

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

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

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

    这根本不是事实。它们既不保留也不释放。保留和释放不会神奇地发生。它一方面响应对
    alloc
    new
    copy
    retain
    release
    的调用。使用点表示法只是方法调用的简写,方法调用中可能包含
    retain

    方法返回的对象不会被释放,而是由其返回的方法释放,因为其局部变量位于
    - (void)setMyString:(NSString *)newString {
        if ( newString != myString ) {
            [myString release];
            myString = [newString retain];
        }
    }