【问题标题】:Autorelease and properties自动释放和属性
【发布时间】:2012-06-16 05:54:37
【问题描述】:

关于以下课程我有几个问题要问

#import <Cocoa/Cocoa.h>

@interface SomeObject {
    NSString *title;
}

@property (retain) NSString *title;

@end




   implementation SomeObject

    @synthesize title;

    -(id)init {
        if (self=[super init])
        {
            self.title=[NSString stringWithFormat:@"allyouneed"];
        }

        return self;
    }

-(void)testMethod{
self.title=[[NSString alloc] init] ;
}

    -(void)dealloc {
        self.title=nil;

        [super dealloc];
    }
  1. 在.h文件中添加属性时是否需要声明title和sub。添加@property (retain) NSString *title 是否不够?行。

2.我是否需要在 init 和 testMethod 中自动释放对标题的分配。如果那为什么?

谁能给我解释一下这些事情。

【问题讨论】:

标签: iphone objective-c ios properties


【解决方案1】:

1..h中不需要声明title,声明property就够了。

2.在init中使用self.title时,不需要自动释放在 dealloc 中释放标题。

【讨论】:

    【解决方案2】:
    1. 您不需要添加,因为它是自动完成的(我猜是从 Xcode 4 开始)。

    2. 在初始化中 - 你不需要,因为它已经返回了一个 autoreleased 对象..

    testMethod 中,您需要分配它..

    您始终必须释放您使用 alloccopynew 创建的任何对象 .... AMEN.. :)

    【讨论】:

      【解决方案3】:

      1- 您不需要在标头中声明 iVar。你也可以使用

      @synthesize myVar = _myVar;
      

      如果您想使用不同的 iVar 名称

      2- 声明一个属性“保留”意味着每次为该属性分配一个新对象时,它会自动释放前一个对象并保留新对象。

      因此,如果您使用 stringwithFormat 之类的便捷方法,该属性将为您保留该对象。

      如果你想使用 alloc-init,对我来说最好的方法是:

      NSString *str = [NSString alloc] init];
      self.title = str;
      [str release];
      

      此外,在 dealloc 中将 nil 分配给属性是正确的,因为该属性将释放它拥有的对象,并且它在 nil 上调用了没有做任何事情的保留

      【讨论】:

        【解决方案4】:

        请注意,在初始化方法和 dealloc 方法中使用访问器方法并不是一个好习惯。请查看此答案:Why shouldn't I use Objective C 2.0 accessors in init/dealloc?

        Apple 的内存管理指南中也有:https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmPractical.html

        【讨论】:

          猜你喜欢
          • 2011-10-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-07-10
          • 2011-11-09
          • 2011-05-03
          • 2014-09-02
          相关资源
          最近更新 更多