自动释放和属性

时间:2012-06-13 09:36:13

标签: iphone objective-c ios properties

关于以下课程,我几乎没有问题

#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(保留)NSString *标题是不够的;线。
  2. 2.我是否需要在init和testMethod中自动释放对标题的赋值。如果是,为什么?

    有人可以向我解释这些事情。

4 个答案:

答案 0 :(得分:2)

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

@synthesize myVar = _myVar;

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

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

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

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

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

此外,将nil分配给dealloc中的属性是正确的,因为该属性将释放它拥有的对象,并且它调用retain on nil,它不执行任何操作

答案 1 :(得分:0)

1.无需在.h中声明标题,声明属性就足够了。

2.当您在init中使用self.title时,您不必自动释放它。但是当您在testMethod中初始化它时,您需要自动释放它,因为您已将该属性声明为retain。并且不要忘记在dealloc中发布标题。

答案 2 :(得分:0)

  1. 你不需要自动添加(因为我猜Xcode 4)。

  2. 初始化中的
  3. - 你没有,因为它已经返回autoreleased个对象..

  4. ,因为你需要分配它所需的testMethod ...

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

答案 3 :(得分:0)

请注意,在初始化方法和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