在目标c中管理记忆

时间:2012-08-12 07:24:14

标签: objective-c ios memory-management memory-leaks nsmutablearray

我在xcode 4.2(旧版本)中进行我的项目。对于我的应用程序,我只是在dto类中设置变量,数组,以便在整个应用程序生命周期中使用。所以我设置了这样的属性。

AppDTO(NSObject的子类)

AppDTO.h

@property(nonatomic,retain)anotherAppDTO *aAppDTO;
@property(nonatomic,retain)NSMutableArray *array1;
@property(nonatomic,retain)NSMutableArray *array2;
@property(nonatomic,retain)NSString *string1,*string2,*string3;

AppDTO.m

- (id)init
{
    self = [super init];
    if (self) {

    self.aAppDTO = [[anotherAppDTO alloc]init];
    self.array1 = [[NSMutableArray alloc]init];
    self.array2 = [[NSMutableArray alloc]init];

    self.string1 = @"Hello";
    self.string2= @"Hai";

    }
}


-(void)dealloc
{
    if(array1 != nil)
    {
        [array1 release];
        array1 = nil;
    }

    if(array2 != nil)
    {
        [array2 release];
        array2 = nil;
    }

    [aAppDTO release];
    aAppDTO = nil;

    [super dealloc];
}

当我在Xcode 4.3.2中分析我的应用程序时,我在self.array1和self.array2(在线分配的对象上的潜在泄漏......)中得到内存警告,但是当我将self.array1更改为array1时,警告发生了程。

使用自我的原因是什么。如果我将@property(nonatomic,retain)设置为变量(如array1,array2,string1,string2),是否需要使用self。

同样在dealloc方法中,我听说我们不想使用[self.array1 release],而是可以使用[array1 release]。它是正确的吗?

我是否需要在dealloc方法中释放我的字符串。

我也在dealloc方法中发布了一个AppDTO。如果我在另一个AppDTO类中分配一些对象,它会在我调用[aAppDTO release]方法时自动释放。

任何人都可以澄清我。

非常感谢, 阿尼什

3 个答案:

答案 0 :(得分:4)

你得到警告,因为当你写:

self.array1 = [[NSMutableArray alloc]init];

与:

相同
[self setArray1: [[NSMutableArray alloc]init]];

您可以注意到您没有分配基础array1私有变量,但您正在调用属性的setter,因为它被声明为 retain 它保留了一旦分配的对象,这个意味着当你最终第二次用setter分配另一个对象时,第一个对象将保留一个的保留计数,直到应用程序将被关闭(因为您不再对该对象有任何引用......)。

查看this精彩文章,了解Objective-C中更好的手动参考计数。

答案 1 :(得分:2)

  

当我在Xcode 4.3.2中分析我的应用程序时,我在self.array1和self.array2中获得内存警告(在线上分配对象的潜在泄漏......),但是当我将self.array1更改为array1时,警告发生程。

分析仪是对的。设置时参数为retain。同样,您应该支持初始化和dealloc中的直接访问。所以,你应该写array1 = [[NSMutableArray alloc] init];,然后完成。

  

使用自我的原因是什么。如果我将@property(非原子,保留)设置为变量(如array1,array2,string1,string2),我是否需要使用self。

那些通过访问器方法。如果不是在初始化或dealloc,你应该倾向于通过访问器方法,因为这是完全构造的对象的通用正确执行路径。

  

同样在dealloc方法中,我听说我们不想使用[self.array1 release],而是可以使用[array1 release]。它是正确的吗?

正确。

  

我是否需要在dealloc方法中释放我的字符串。

  

我也在dealloc方法中发布了一个AppDTO。如果我在另一个AppDTO类中分配一些对象,当我调用[aAppDTO release]方法时它会自动释放。

当其引用计数达到0时,将调用其dealloc

答案 2 :(得分:0)

我认为其他人已经回答了你的问题。

我确实想提请你注意Apple优秀的Advance Memory Management Programming Guide: Practical Memory Management,他们会在这些场景中走过这些场景。在第一次阅读时很难全部完成,但它确实涵盖了这些内容。在回答关于使用实例变量和访问器方法的问题时,我提请您注意标记为“不要在初始化方法和dealloc中使用访问器方法”的部分。