Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 在Objective c中管理内存_Objective C_Ios_Memory Management_Memory Leaks_Nsmutablearray - Fatal编程技术网

Objective c 在Objective c中管理内存

Objective c 在Objective c中管理内存,objective-c,ios,memory-management,memory-leaks,nsmutablearray,Objective C,Ios,Memory Management,Memory Leaks,Nsmutablearray,我正在用xcode 4.2(旧版本)做我的项目。对于我的应用程序,我只是在dto类中设置变量和数组,以便在整个应用程序生命周期中使用。所以我设置了一个这样的属性 AppDTO(NSObject的子类) 附件h @property(nonatomic,retain)anotherAppDTO *aAppDTO; @property(nonatomic,retain)NSMutableArray *array1; @property(nonatomic,retain)NSMutableArray *

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

AppDTO(NSObject的子类)

附件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时,警告消失了

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

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

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

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

谁能给我澄清一下吗

非常感谢,,
Anish

你会收到警告,因为当你写:

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

[self setArray1: [[NSMutableArray alloc]init]];
正如您所注意到的,您没有分配底层
array1
私有变量,而是调用属性的setter,因为它被声明为retain,一旦分配,它将保留对象,这意味着,当您最终将使用setter第二次分配另一个对象时,第一个对象将保留一个retain计数,直到应用程序关闭为止(因为您不再有对该对象的任何引用…)


请看一篇优秀的文章,以更好地理解Objective-C中的手动引用计数。

您会收到警告,因为当您编写以下内容时:

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

[self setArray1: [[NSMutableArray alloc]init]];
正如您所注意到的,您没有分配底层
array1
私有变量,而是调用属性的setter,因为它被声明为retain,一旦分配,它将保留对象,这意味着,当您最终将使用setter第二次分配另一个对象时,第一个对象将保留一个retain计数,直到应用程序关闭为止(因为您不再有对该对象的任何引用…)

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

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

分析仪是对的。设置时,参数为
retain
ed。同样,您应该在初始化和
dealloc
中支持直接访问。因此,您应该只编写
array1=[[NSMutableArray alloc]init],并且可以完成

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

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

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

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

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

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

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

分析仪是对的。设置时,参数为
retain
ed。同样,您应该在初始化和
dealloc
中支持直接访问。因此,您应该只编写
array1=[[NSMutableArray alloc]init],并且可以完成

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

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

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

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

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


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

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


我想提请大家注意苹果公司的卓越业绩,在这一业绩中,他们经历了这些情景。在一读时很难完全理解,但它确实涵盖了这些内容。在回答您关于使用实例变量与访问器方法的问题时,我提请您注意标记为“不要在初始化器方法和dealloc中使用访问器方法”的部分。

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

我想提请大家注意苹果公司的卓越业绩,在这一业绩中,他们经历了这些情景。在一读时很难完全理解,但它确实涵盖了这些内容。在回答您关于使用实例变量和访问器方法的问题时,我提请您注意标记为“不要在初始化器方法和dealloc中使用访问器方法”的部分<