0

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

AppDTO(NSObject 的子类)

应用程序DTO.h

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

应用程序DTO.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 时,警告消失了。

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

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

我需要在 dealloc 方法中释放我的字符串吗?

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

任何人都可以澄清我。

非常感谢, 阿尼什

4

3 回答 3

4

您会收到警告,因为当您编写时:

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

是相同的 :

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

正如您所注意到的,您没有分配底层array1私有变量,但是您正在调用属性的设置器,因为它被声明为retain ,它会在分配后保留对象,这意味着当您最终将第二次分配另一个对象时setter 第一个对象的保留计数将保持为一个,直到应用程序关闭(因为您不再有对该对象的任何引用......)。

看看这篇很棒的文章,以更好地理解 Objective-C 中的手动引用计数。

于 2012-08-12T07:30:56.333 回答
2

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

分析仪是对的。该参数retain在设置时被编辑。同样,您应该支持在初始化和dealloc. 所以,你应该只写array1 = [[NSMutableArray alloc] init];,然后就完成了。

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

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

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

正确的。

我需要在 dealloc 方法中释放我的字符串吗?

是的。

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

当它的引用计数达到 0 时,它dealloc会被调用。

于 2012-08-12T07:34:43.460 回答
0

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

我确实想提请您注意 Apple 出色的高级内存管理编程指南:实用内存管理,他们在其中介绍了这些场景。在第一次阅读时很难全盘接受,但它确实涵盖了这些东西。在回答您关于使用实例变量与访问器方法的问题时,我提请您注意标记为“不要在初始化方法和 dealloc 中使用访问器方法”的部分。

于 2012-08-12T09:05:49.070 回答