【发布时间】:2009-06-29 22:34:00
【问题描述】:
我真的对此感到困惑。我相信我正在以正确的方式管理内存,但执行代码表明我正在双重释放该对象。这是代码,然后我会解释发生了什么。
@protocol SomeDelegate <NSObject>
@required
- (id)initWithCols:(NSUInteger)Cols Rows:(NSUInteger)Rows;
@end
@interface SomeObject : NSObject <SomeDelegate> {
}
- (id)initWithCols:(NSUInteger)Cols Rows:(NSUInteger)Rows;
@end
@interface Layout : UIView {
id<SomeDelegate> someDelegate;
}
@property(retain) id<SomeDelegate> someDelegate;
- (id)initWithFrame:(CGRect)aRect Cols:(NSUInteger)Cols Rows:(NSUInteger)Rows;
@end
@implementation Layout
@synthesize someDelegate;
- (id)initWithFrame:(CGRect)aRect Cols:(NSUInteger)Cols Rows:(NSUInteger)Rows {
if(self = [super initWithFrame:aRect]) {
cols = Cols;
rows = Rows;
id<SomeDelegate> delegate = [[SomeObject alloc] initWithCols:cols Rows:rows];
[self setSomeDelegate:delegate];
//[delegate release];
}
return self;
}
-(void)dealloc {
[someDelegate release];
[super dealloc];
}
@end
现在,当我取消注释“//[代表发布];”时布局类的构造函数中的行,然后我收到“EXC_BAD_ACCESS”错误,并且应用程序在尝试解除分配时崩溃。我已经将崩溃追溯到 Layout 类的 dealloc 方法中 someDelegate 对象的释放。如果我留下评论,那么应用程序就可以正常工作。
有人可以解释为什么会发生这种情况,因为它似乎违背了我所读到的关于 Objective-C 内存管理的所有内容。
请注意,代码示例确实有效,但是我的代码没有遵循示例。我的实际 SomeObject 内部是否存在导致自动释放的东西?
提前致谢。
【问题讨论】:
-
只是出于好奇,如果将“delegate”变量重命名为其他名称会怎样?我知道这无关紧要,但我记得在 cocoa-dev 邮件列表中读到过同样的内容;某些变量名称的奇怪行为。 UIView 有自己的委托,我想知道它是否与此有关。
-
好主意,但不幸的是我尝试将其重命名为委托,但仍然存在发布问题。
-
请注意,代码 sn-p 确实有效,所以我认为我的 SomeObject(完整代码而不是 sn-p)中有一些东西导致它自动释放。对象可以在没有被告知的情况下自动释放吗?
-
许多方法返回自动释放的对象,NSString 的 +stringWith... 和 -stringBy... 方法返回自动释放的对象。您发布的代码肯定符合 Cocoa 内存管理规则,因此请注意代码中的流氓“释放”和“自动释放”方法,并确保保留未由您自己的代码显式分配的所有内容。如果仍然无法正常工作,请提交错误。
-
问题是一个子类深处的 MutableArray,它是通过工厂创建的(自动发布),但我也在发布。 Zombie 的东西有点帮助,它告诉我一个数组是罪魁祸首,但除此之外没什么。
标签: objective-c memory-management