Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.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 Obj-C,在线分配对象的潜在泄漏。。。NSMutableArray alloc_Objective C_Xcode_Cocoa Touch_Analyzer - Fatal编程技术网

Objective c Obj-C,在线分配对象的潜在泄漏。。。NSMutableArray alloc

Objective c Obj-C,在线分配对象的潜在泄漏。。。NSMutableArray alloc,objective-c,xcode,cocoa-touch,analyzer,Objective C,Xcode,Cocoa Touch,Analyzer,我在跟踪此内存泄漏错误时遇到一些问题。在线分配的对象的潜在泄漏… @interface BNPieChart : UIView { @private NSMutableArray* slicePointsIn01; } m - (id)initWithFrame:(CGRect)frame { if (self = [super initWithFrame:frame]) { [self initInstance]; self.frame = f

我在跟踪此内存泄漏错误时遇到一些问题。
在线分配的对象的潜在泄漏…

@interface BNPieChart : UIView {
@private
    NSMutableArray* slicePointsIn01;
}

m
- (id)initWithFrame:(CGRect)frame {
    if (self = [super initWithFrame:frame]) {
        [self initInstance];
        self.frame = frame;        
        slicePointsIn01 = [[NSMutableArray alloc]
                       initWithObjects:nFloat(0.0), nil];       

- (void)initInstance {
    slicePointsIn01 = [[NSMutableArray alloc]
                       initWithObjects:nFloat(0.0), nil];
我确实尝试为
slicePointsIn01
添加属性/synthesis/dealloc,但是这会给我同样的错误


我做错了什么

slicePointsIn01
设置为两个不同的对象:一个在
initInstance
中,然后再在
initWithFrame:
中设置一个

由于第一个对象被设置为
alloc
'd对象,因此在更改分配之前,该对象从未
release
,因此原始对象会泄漏

如果添加属性,则需要确保实际使用它,而不是直接使用实例变量。您可以通过以下两种方式之一完成作业:

self.myProperty = //something;
[self setMyProperty: //something];
注意(谢谢@André):请确保
something
对象在赋值时的保留计数为0(即通常为自动删除),因为属性会为您保留它

//NOT like this:
myProperty = //something;
此行直接使用实例变量。它会导致泄漏,因为在不使用属性的情况下,指向的对象上的引用计数不会更改

编辑: 你不应该检查保留计数。只要在使用对象的每个地方遵守规则,您就会没事

  • 通过为对象分配内存或复制它,即使用方法
    alloc
    allocWithZone:
    copyWithZone:
    copyWithZone:
    mutableCopy
    mutableCopyWithZone:

  • 如果您不是对象的创建者,但希望确保它保留在内存中供您使用,则可以通过调用
    retain

  • 如果您通过创建或表达所有权权益拥有一个对象,则您有责任在不再需要它时通过调用
    release
    autorelease

  • 相反,如果您不是某个对象的创建者,并且没有表示所有权权益,则不得释放该对象

  • 如果您从程序中的其他地方接收到对象,通常保证该对象在接收该对象的方法或函数中保持有效。如果希望它在该范围之外保持有效,则应保留或复制它。如果您试图释放一个已经释放的对象,您的程序就会崩溃


您不必编写
setMyProperty
。当您
@合成属性时,将为您创建该方法。

切片点sin01
将设置为两个不同的对象:一个在
initInstance
中,然后在
initWithFrame:
中再次设置

由于第一个对象被设置为
alloc
'd对象,因此在更改分配之前,该对象从未
release
,因此原始对象会泄漏

如果添加属性,则需要确保实际使用它,而不是直接使用实例变量。您可以通过以下两种方式之一完成作业:

self.myProperty = //something;
[self setMyProperty: //something];
注意(谢谢@André):请确保
something
对象在赋值时的保留计数为0(即通常为自动删除),因为属性会为您保留它

//NOT like this:
myProperty = //something;
此行直接使用实例变量。它会导致泄漏,因为在不使用属性的情况下,指向的对象上的引用计数不会更改

编辑: 你不应该检查保留计数。只要在使用对象的每个地方遵守规则,您就会没事

  • 通过为对象分配内存或复制它,即使用方法
    alloc
    allocWithZone:
    copyWithZone:
    copyWithZone:
    mutableCopy
    mutableCopyWithZone:

  • 如果您不是对象的创建者,但希望确保它保留在内存中供您使用,则可以通过调用
    retain

  • 如果您通过创建或表达所有权权益拥有一个对象,则您有责任在不再需要它时通过调用
    release
    autorelease

  • 相反,如果您不是某个对象的创建者,并且没有表示所有权权益,则不得释放该对象

  • 如果您从程序中的其他地方接收到对象,通常保证该对象在接收该对象的方法或函数中保持有效。如果希望它在该范围之外保持有效,则应保留或复制它。如果您试图释放一个已经释放的对象,您的程序就会崩溃


您不必编写
setMyProperty
。当你合成一个属性时,这个方法就是为你创建的。

你是否试图
释放
切片点sin01?你是否试图
释放
切片点sin01?另一方面,如果你最终使用属性赋值,不要这样做-self.myProperty=[[SomeObject alloc]init]-因为如果你这样做,保留计数将为2(一个来自保留,一个来自初始化)。如何检查保留计数?我假设我在setMyProperty方法中执行此检查?任何人都有任何需要添加的内容:(?@Jules:您不应该检查保留计数。我已更新了我的答案。另一方面,如果您最终使用该属性进行赋值,请不要执行此操作-self.myProperty=[[SomeObject alloc]init]——因为如果执行此操作,保留计数将为2(一个来自retain,一个来自初始化)。我如何检查retain计数?我假设我在setMyProperty方法中进行此检查?有人需要进一步添加:(?@Jules:您应该