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:您应该