0

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

#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 文件中添加属性时是否需要声明标题和子项。添加@property (retain) NSString *title 是否不够?线。

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

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

4

4 回答 4

2

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

@synthesize myVar = _myVar;

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

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

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

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

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

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

于 2012-06-13T09:48:54.230 回答
0

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

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

于 2012-06-13T09:40:48.130 回答
0
  1. 您不需要添加,因为它是自动完成的(我猜是从 Xcode 4 开始)。

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

testMethod因为你正在分配它,所以你需要在哪里..

您总是必须释放您使用创建的任何对象alloccopy或者new.... AMEN.. :)

于 2012-06-13T09:41:27.323 回答
0

请注意,在初始化方法和 dealloc 方法中使用访问器方法并不是一个好的做法。请查看这个答案:为什么我不应该在 init/dealloc 中使用 Objective C 2.0 访问器?

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

于 2012-06-13T10:36:50.123 回答