initWithFrame 中的内存泄漏
Posted
技术标签:
【中文标题】initWithFrame 中的内存泄漏【英文标题】:Memory Leak in initWithFrame 【发布时间】:2011-03-29 13:42:06 【问题描述】:我使用带有其他视图的 NSMutableArray 的 UIView 子类将值指示为条形。 我在我的 initWithFrame 中初始化它。在创建和删除我的 UIView 子类几次后,仪器告诉 NSMutableArray 的分配存在泄漏。 这就是为什么我用 if 框住它以避免多个对象。但没有帮助
- (id) initWithFrame :(CGRect)frame
self = [super initWithFrame:frame];
if (self.uiValueSubviews == nil)
self.uiValueSubviews = [[NSMutableArray alloc]init];
return self;
- (void)dealloc
[self.uiValueSubviews release];
[super dealloc];
我的 dealloc 有什么问题吗?感谢您的帮助
【问题讨论】:
【参考方案1】:我发现内存管理涉及您的财产的两个问题。
-
属性应始终设置为
autorelease
d 对象或
您将在您的
拥有。
切勿将授权书直接发送给财产。如果可能的话,我更喜欢释放底层变量(例如[_uiValueSubviews release];
)
将代码更改为以下内容。
- (id) initWithFrame :(CGRect)frame
self = [super initWithFrame:frame];
if (self.uiValueSubviews == nil)
//Set to autoreleased array
self.uiValueSubviews = [NSMutableArray array];
return self;
- (void)dealloc
//nil the value
self.uiValueSubviews = nil;
[super dealloc];
【讨论】:
+1,但我想补充一点,您的属性需要 retain 或 copy,而不是 assign (在这种情况下确实应该如此)。 这是真的,我假设它至少是保留,因为他报告了内存泄漏。您的属性应该类似于@property(retain) NSMutableArray *uiValueSubviews
;
谢谢,该死的我从没想过(保留)我的属性,我想我必须改变更多:)【参考方案2】:
你应该这样做:
- (id) initWithFrame :(CGRect)frame
if ((self = [super initWithFrame:frame]))
if (self.uiValueSubviews == nil)
uiValueSubviews = [[NSMutableArray alloc]init];
return self;
- (void)dealloc
self.uiValueSubviews = nil;
[super dealloc];
你的 uiValueSubviews 可能是一个保留属性,所以当你分配时,你的 retainCount 是 +1 和 self.也 +1。
【讨论】:
【参考方案3】:另一种避免自动释放对象的方法是:
// ...
if (self.uiValueSubviews == nil)
NSMutableArray *uiValueSubviews_tmp = [[NSMutableArray alloc] init];
// maybe do something with uiValueSubviews_tmp
self.uiValueSubviews = uiValueSubviews_tmp;
[uiValueSubviews_tmp release];
// ....
据我所知,Apple 在他们的示例中就是这样做的。
【讨论】:
以上是关于initWithFrame 中的内存泄漏的主要内容,如果未能解决你的问题,请参考以下文章