Objective-C中的alloc内存泄漏

Objective-C中的alloc内存泄漏,objective-c,memory-management,memory-leaks,Objective C,Memory Management,Memory Leaks,我是Objective-C的新手,因此我在理解内存管理方面有一些问题。我创建了一个没有ARC的项目(了解内存管理),我想知道如何避免内存泄漏 我用一些C++代码解释。例如,我想用3个向量创建一个矩阵,所以在C++中,我们可以(第一个方法): 在函数结束时,所有对象都被销毁,并且没有内存泄漏 在Objective-C中,我们会这样做: Matrix mat = [[Matrix alloc] init:[[Vector alloc] init:1:1:1]:[[Vector alloc] init

我是Objective-C的新手,因此我在理解内存管理方面有一些问题。我创建了一个没有ARC的项目(了解内存管理),我想知道如何避免内存泄漏

我用一些C++代码解释。例如,我想用3个向量创建一个矩阵,所以在C++中,我们可以(第一个方法):

在函数结束时,所有对象都被销毁,并且没有内存泄漏

在Objective-C中,我们会这样做:

Matrix mat = [[Matrix alloc] init:[[Vector alloc] init:1:1:1]:[[Vector alloc] init:2:2:2]];
< C++ >(第二种方法):

但是通过这种方式,我们不能破坏这两个向量,所以我们会造成内存泄漏


所以我的问题是,有没有办法在Objective-C中实现第一种方法?如果没有,我想我必须创建两个临时变量,其中包含两个向量,在矩阵初始化后释放,或者有另一种方法可以做到这一点?

您的Objective-C代码是错误的。你的假设是对的

所以我的问题是,有没有办法在Objective-C中实现第一种方法?如果没有,我想我必须创建两个临时变量,它们包含两个向量,在矩阵初始化后释放,或者有另一种方法

另一种方法是使用类方法获取自动释放的对象。这些方法以加号开始。 或者你也可以自己自动释放向量

[[[Vector alloc] init:1:1:1] autorelease];
顺便说一下:在Objective-C中,不应该使用未命名的参数。因此,您的init应该如下所示:

[[[Vector alloc] initWithX:1 y:1 z:1] autorelease];

但我强烈建议使用ARC,不要再担心内存管理。

您的Objective-C代码是错误的。你的假设是对的

所以我的问题是,有没有办法在Objective-C中实现第一种方法?如果没有,我想我必须创建两个临时变量,它们包含两个向量,在矩阵初始化后释放,或者有另一种方法

另一种方法是使用类方法获取自动释放的对象。这些方法以加号开始。 或者你也可以自己自动释放向量

[[[Vector alloc] init:1:1:1] autorelease];
顺便说一下:在Objective-C中,不应该使用未命名的参数。因此,您的init应该如下所示:

[[[Vector alloc] initWithX:1 y:1 z:1] autorelease];

但我强烈建议使用ARC,不要再担心内存管理。

您正确地认为需要使用临时变量来正确释放对象

通常在弧前代码中,您会使用自动释放:

Matrix mat = [[Matrix alloc] init:[[[Vector alloc] init:1:1:1] autorelease] :[[[Vector alloc] init:2:2:2] autorelease]];
或者,更好的是,您可以为Vector添加一个方便的方法:

+ (Vector*) vector:(int)a :(int)b :(int)c
{
    return [[[Vector alloc] init:a :b :c] autorelease];
}
然后使用它:

Matrix mat = [[Matrix alloc] init:[Vector vector:1 :1 :1] :[Vector vector:2 :2 :2]];

(顺便说一句,在冒号前不加单词命名方法是不好的,很难阅读。)

您正确地认为需要使用临时变量来正确释放对象

通常在弧前代码中,您会使用自动释放:

Matrix mat = [[Matrix alloc] init:[[[Vector alloc] init:1:1:1] autorelease] :[[[Vector alloc] init:2:2:2] autorelease]];
或者,更好的是,您可以为Vector添加一个方便的方法:

+ (Vector*) vector:(int)a :(int)b :(int)c
{
    return [[[Vector alloc] init:a :b :c] autorelease];
}
然后使用它:

Matrix mat = [[Matrix alloc] init:[Vector vector:1 :1 :1] :[Vector vector:2 :2 :2]];

(顺便说一下,在你的冒号之前说出你的方法是很糟糕的,因为它很难阅读)

< p>你需要释放所有你分配的对象,比如C++新的和删除的。所以一种方法是,如您所说,创建临时变量,然后释放它们

Matrix *mat = [[[Matrix alloc] initWithVectors:[[[Vector alloc] initWithCoordinatesX:1 y:1 z:1] autorelease],
                                               [[[Vector alloc] initWithCoordinatesX:1 y:1 z:1] autorelease],
                                               [[[Vector alloc] initWithCoordinatesX:1 y:1 z:1] autorelease], nil] autorelease];
但是,也有autorelease,当释放包含对象的autorelease池时,它将释放对象,例如,如果您尚未创建自己的池,则在主NSApplication循环中释放对象。在这种情况下,这允许您在线进行内存管理

所以

作为一个开始


我会看几个例子来学习这个机制,但是去ARC做任何实际的工作——你可能需要了解调试的底层发布机制。

< p>你需要释放所有你分配的对象,比如C++新的和删除。所以一种方法是,如您所说,创建临时变量,然后释放它们

Matrix *mat = [[[Matrix alloc] initWithVectors:[[[Vector alloc] initWithCoordinatesX:1 y:1 z:1] autorelease],
                                               [[[Vector alloc] initWithCoordinatesX:1 y:1 z:1] autorelease],
                                               [[[Vector alloc] initWithCoordinatesX:1 y:1 z:1] autorelease], nil] autorelease];
但是,也有autorelease,当释放包含对象的autorelease池时,它将释放对象,例如,如果您尚未创建自己的池,则在主NSApplication循环中释放对象。在这种情况下,这允许您在线进行内存管理

所以

作为一个开始


我会看几个例子来学习这个机制,但如果要做任何实际工作,请转到ARC——您可能需要了解底层的发布机制以进行调试。

除了语法不符合Obj-C的事实之外,在这种情况下,还有几个选项可用于管理内存

注意:我假设您不想将参数存储到变量中,否则只需在将这些变量传递给构造函数后释放这些变量即可。对于ARC,这并不是一个很大的区别,因为在任何情况下都不需要释放

无弧。工厂方法

Objective-C中的工厂方法按惯例自动释放。这种约定非常强大,即使是ARC也会期望这样的方法被自动删除,所以要小心

Matrix *mat = [Matrix matrixWithVectors:[Vector vectorWithCoordinatesX:1 y:1 z:1],
                                        [Vector vectorWithCoordinatesX:1 y:1 z:1],
                                        [Vector vectorWithCoordinatesX:1 y:1 z:1], nil];
例如,
vectorWithCoordinates
的实现应该如下

+ (Vector *)vectorWithCoordinatesX:(CGFloat)x y:(CGFloat)y z:(CGFloat)z {
    return [[[Vector alloc] initWithCoordinatesX:x y:y z:z] autorelease];
}
无弧。自动释放

如果在内联创建参数时没有保留对参数的引用,也可以显式自动释放它们

Matrix *mat = [[[Matrix alloc] initWithVectors:[[[Vector alloc] initWithCoordinatesX:1 y:1 z:1] autorelease],
                                               [[[Vector alloc] initWithCoordinatesX:1 y:1 z:1] autorelease],
                                               [[[Vector alloc] initWithCoordinatesX:1 y:1 z:1] autorelease], nil] autorelease];

在ARC中不需要发布,因为编译器会处理它

所以两者都是

Matrix *mat = [Matrix matrixWithVectors:[Vector vectorWithCoordinatesX:1 y:1 z:1],
                                        [Vector vectorWithCoordinatesX:1 y:1 z:1],
                                        [Vector vectorWithCoordinatesX:1 y:1 z:1], nil];

你说得对


我在这里的假设是,
矩阵
构造函数将任意数量的向量作为参数,
nil
终止。

除了语法不是真正符合Obj-C的事实之外,在这种情况下,还有几个选项可用于管理内存

注意:我假设您不想将参数存储到变量中,否则只需在将这些变量传递给构造函数后释放这些变量即可。对于ARC,这并不是一个很大的区别,因为在任何情况下都不需要释放

无弧。工厂方法

F