gpt4 book ai didi

objective-c - 在不应该发生的时候双重释放

转载 作者:搜寻专家 更新时间:2023-10-30 20:04:58 25 4
gpt4 key购买 nike

我真的很困惑。我相信我正在以正确的方式管理内存,但执行代码表明我正在双重释放对象。这是代码,然后我将解释发生了什么。

@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

现在,当我取消注释“//[delegate release];”时Layout 类的构造函数中的一行,然后我收到“EXC_BAD_ACCESS”错误,并且应用程序在尝试解除分配时崩溃。我已将崩溃追溯到 Layout 类的 dealloc 方法中的 someDelegate 对象的释放。如果我留下评论,那么应用程序可以正常工作。

谁能解释一下为什么会这样,因为它似乎与我所读到的有关 Objective-C 内存管理的所有内容背道而驰。

请注意,代码示例确实有效,但我的代码并不遵循该示例。我实际的 SomeObject 中是否存在导致自动释放的内容?

提前致谢。

最佳答案

首先,返回并重新阅读 memory management rules只是为了确保您在其他地方使用委托(delegate)时没有遗漏任何明显的东西。

接下来,打开 NSZombieEnabled(在您的可执行文件设置中,Arguments 面板,添加一个环境变量 NSZombieEnabled 设置为 YES)。

然后向你的委托(delegate)添加一个 dealloc 方法,如果它还没有的话(确保你调用 [super dealloc]!)并在那里放置一个断点 - 当你的委托(delegate)被释放时它会告诉你它会告诉你什么时候发布。

或者,将简单的释放/自动释放方法添加到您的委托(delegate)类中,这些方法除了调用之外什么都不做,然后给它们设置断点,这将告诉您它何时被释放。

最后三点评论:在 Objective C/Cocoa 的标准命名约定中,您应该使用小写参数字段,即它应该是:

- (id)initWithFrame:(CGRect)aRect cols:(NSUInteger)Cols rows:(NSUInteger)Rows;

当你的ivar和property命名相同时,很容易不小心用错了,所以我建议使用不同的ivar名称和property名称以避免混淆,要么像Apple一样使用_前缀,要么使用其他前缀也为了避免与 Apple 混淆:

  id<SomeDelegate> _someDelegate;

@synthesize someDelegate = _someDelegate;

Apple 建议不要在 init/dealloc 中使用 setters/getters,所以你的初始化代码应该是:

_someDelegate = [[SomeObject alloc] initWithCols:cols Rows:rows];

关于objective-c - 在不应该发生的时候双重释放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1060912/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com