English 中文(简体)
内存管理-如何最好地初始化标头中声明的实例
原标题:Memory management - how best to initialise an instance declared in the header

我已经读了一些关于这方面的帖子,但有一件事我还不清楚。我知道这可能是一个n00b问题,但实际上我在没有完全掌握这个基本问题的情况下已经进入了相当长的发展阶段。我想这是自学成才的症状。

您在头中声明一个变量,如下所示:

@interface SomeClass : NSObject {
    NSMutableArray *anArray;
}

@property (nonatomic, retain) NSMutableArray *anArray;

end

然后在主文件中对其进行合成,并将其设置为初始值:

    @implementation SomeClass

@synthesize anArray

- (SomeClass *)init{
    if (self = [super init]) {
        self.anArray = [[NSMutableArray alloc] initWithCapacity:10];
}
[return self];

并在你的班级解除锁定时释放它:

- (void)dealloc {
[anArray release];
[super dealloc];
}

现在,当我运行仪器时

self.anArray = [[NSMutableArray alloc] initWithCapacity:10];

被识别为内存泄漏。这是内存泄漏吗?因为当您在头中定义变量anArray时,它会分配内存?(因为我认为它是一个空指针。)因此,当你想初始化它,并调用[[NSMutableArray alloc]initWithCapacity:10]时,你正在重新分配内存,并丢失指向原始分配的指针?

因此,我使用方便类方法:

@implementation SomeClass

    @synthesize anArray

    - (SomeClass *)init{
        if (self = [super init]) {
            self.anArray = [NSMutableArray arrayWithCapacity:10];
    }
    [return self];

这不再被确定为仪器中的内存泄漏。由于这是一种方便的方法,anArray是自动发布的。但是,如果我假设头中的实例声明分配内存,这将解释前面的问题,那么我是否仍然应该释放anArray?以这种方式设置初始值可能会保留它吗?

我理解

NSMutableArray *anArray = [[NSMutableArray alloc] initWithCapacity:10];

NSMutableArray *anArray = [NSMutableArray arrayWithCapactiy:10];

but what I m not sure I underst和is when you ve declared NSMutableArray *anArray in your header, which of the two approaches you should use 和why. And whether or not if you use the second approach, you should still release anArray when you call dealloc.

我可以补充一点,我发现以下帖子/链接很有用:

最佳回答

分配内存的不是实例。您可以正确地假设,在Objective-C中(至少在所有基于苹果的操作系统上),新初始化的类的所有ivar都设置为0(或nil或NULL,视情况而定)。

您看到的问题是您在初始化中使用的是属性,而不是ivar。由于您已将属性声明为retain,因此使用属性访问器对其进行设置会自动保留该属性。

因此,当您初始化时,您要么必须获得所有权并直接设置ivar,要么像您正在做的那样,使用属性访问器设置属性,然后放弃init方法中的所有权(通过释放您拥有的对象,或者像在第二个实例中那样,使用方便构造函数,这样您就永远不会拥有返回的实例)。

因此,请记住,如果您使用属性访问器,即使是在类本身中,您也会获得您在属性上设置的功能(例如,nonatomic、retain等)。无论何时执行以下操作之一,都会使用属性访问程序:

// in these cases the property takes ownership through the
// retain keyword, so you must not take ownership yourself
self.anArray = something;
[self setAnArray:something];
[self setValue:something forKey:@"anArray"];

您可以直接访问您的ivar,方式如下:

anArray = something; // in this case you must take ownership
问题回答

alloc ing an object starts it off with a reference count of 1. Setting a property that has the retain attribute also increases the reference count.

所以,这意味着这通常很糟糕:

@property (nonatomic, retain) Object * variable;

。。。

self.variable = [[Object alloc] init];

因为变量现在的引用计数为2。

设置对象的成员变量时,只需执行以下操作:

variable = [[Object alloc] init];

你也应该意识到这是有效的

        self.anArray = [NSMutableArray arrayWithCapacity:10];

因为“arrayWithCapacity”(和其他类似的因子方法)会自动释放它返回的对象,所以在设置属性后,它的引用计数基本上为1。





相关问题
Code sign Error

I have created a new iPhone application.I have two mach machines. I have created the certificate for running application in iPhone in one mac. Can I use the other mac for running the application in ...

ABPersonViewController Usage for displaying contact

Created a View based Project and added a contact to the AddressBook using ABAddressBookRef,ABRecordRef now i wanted to display the added contact ABPersonViewController is the method but how to use in ...

将音频Clips从Peter改为服务器

我不禁要问,那里是否有任何实例表明从Peit向服务器发送音响。 I m不关心电话或SIP风格的解决办法,只是一个简单的袖珍流程......

• 如何将搜查线重新定位?

我正试图把图像放在搜索条左边。 但是,问题始于这里,搜索条线不能重新布署。

热门标签