Objective-C内存管理之谜
这是我的一个项目中用于管理我的一个类实例的一段代码:Objective-C内存管理之谜,objective-c,Objective C,这是我的一个项目中用于管理我的一个类实例的一段代码: @interface C: NSObject { NSMutableArray *myArr; } @property (nonatomic,retain) NSMutableArray *myArr; //... @end @implementation C @synthesize myArr; //... -(id)init { //... myArr = [[NSMutableArray alloc] in
@interface C: NSObject
{
NSMutableArray *myArr;
}
@property (nonatomic,retain) NSMutableArray *myArr;
//...
@end
@implementation C
@synthesize myArr;
//...
-(id)init
{
//...
myArr = [[NSMutableArray alloc] init];
//...
}
//version 1 of dealloc method
-(void)dealloc
{
//...
self.myArr = nil;
//...
}
//version 2 of dealloc method
-(void)dealloc
{
//...
[myArr release];
//...
}
这里版本1的dealloc方法不起作用,Xcode说了类似“EXC_BAD_ACCESS…”的话,应用程序崩溃了。
如果我将dealloc方法修改为版本2,它就可以工作
有人知道为什么吗?
Thx提前。看起来您的myArr对象在不应该被发送的时候被发送了消息,在第一种情况下,您通过将其设置为nil来隐藏问题,而在第二种情况下,您没有。这两种方法都不应该崩溃。你什么时候打电话给[super Dealoc];(您应该在dealloc实现结束时调用它)。看起来您的myArr对象在不应该的时候收到了消息,在第一种情况下,您通过将其设置为nil来隐藏问题,而在第二种情况下,您没有。这两种方法都不应该崩溃。你什么时候打电话给[super Dealoc];(您应该在dealloc实现结束时调用它)。即使iVar和属性使用相同的名称是一个坏主意/令人困惑,这也没关系。我删除了iVar声明
@interface C: NSObject
{}
@property (nonatomic,retain) NSMutableArray *myArr;
//...
@end
使用@synthetize生成iVar
@implementation C
@synthesize myArr = _myArr;
//...
你的建议全错了。您正在分配iVar,而不使用setter方法
-(id)init
{
//...
// You were doing
// _myArr = [[NSMutableArray alloc] init];
// You should do
NSMutableArray array = [[NSMutableArray alloc] init];
self.myArr = array;
[array release];
// You could avoid the temporary variable but this confuse XCode static analyzer
//...
}
这没关系。我猜@synthetize生成了另一个iVar来支持您的财产。
另一个iVar分配不正确
如果不使用self.myArr(或等效的[self-myArr]),您不会注意到这一点
这种混乱是硬核ObjC程序员不喜欢新属性的主要原因。:)这让新程序员感到困惑
//version 1 of dealloc method
-(void)dealloc
{
//...
self.myArr = nil;
//...
}
这是不好的,因为您绕过了setter,就像在init方法中一样。不管怎样,这是有效的
//version 2 of dealloc method
-(void)dealloc
{
//...
[myArr release];
//...
}
即使iVar和属性具有相同的名称是个坏主意/令人困惑,这也没关系。我删除了iVar声明
@interface C: NSObject
{}
@property (nonatomic,retain) NSMutableArray *myArr;
//...
@end
使用@synthetize生成iVar
@implementation C
@synthesize myArr = _myArr;
//...
你的建议全错了。您正在分配iVar,而不使用setter方法
-(id)init
{
//...
// You were doing
// _myArr = [[NSMutableArray alloc] init];
// You should do
NSMutableArray array = [[NSMutableArray alloc] init];
self.myArr = array;
[array release];
// You could avoid the temporary variable but this confuse XCode static analyzer
//...
}
这没关系。我猜@synthetize生成了另一个iVar来支持您的财产。
另一个iVar分配不正确
如果不使用self.myArr(或等效的[self-myArr]),您不会注意到这一点
这种混乱是硬核ObjC程序员不喜欢新属性的主要原因。:)这让新程序员感到困惑
//version 1 of dealloc method
-(void)dealloc
{
//...
self.myArr = nil;
//...
}
这是不好的,因为您绕过了setter,就像在init方法中一样。不管怎样,这是有效的
//version 2 of dealloc method
-(void)dealloc
{
//...
[myArr release];
//...
}
正如Duncan所说,EXEC_BAD_访问错误意味着对象不再存在 这可能是因为myArr是在调用dealloc之前被释放的 为了便于内存管理和跟踪引用计数,我想在init方法中更清楚地说明这一点,例如:
-(id)init
{
//...
NSMutableArray *array = [[NSMutableArray alloc] initWithCapacity:0];
self.myArr = array;
[array release];
//...
}
使用生成的setterself.myArr=array代码>如果您确保引用计数被正确删除,它将释放旧值并为您保留新值
@MadhavanRP:如果财产是保留财产:
@property(nonatomic, retain) NSMutableArray *myArr;
召唤
self.myArr=nil
和打电话完全一样
[myArr release];
myArr = nil;
编辑:@Sylvain击败了我:)正如邓肯所说,EXEC\u BAD\u访问错误意味着该对象不再存在
这可能是因为myArr是在调用dealloc之前被释放的
为了便于内存管理和跟踪引用计数,我想在init方法中更清楚地说明这一点,例如:
-(id)init
{
//...
NSMutableArray *array = [[NSMutableArray alloc] initWithCapacity:0];
self.myArr = array;
[array release];
//...
}
使用生成的setterself.myArr=array代码>如果您确保引用计数被正确删除,它将释放旧值并为您保留新值
@MadhavanRP:如果财产是保留财产:
@property(nonatomic, retain) NSMutableArray *myArr;
召唤
self.myArr=nil
和打电话完全一样
[myArr release];
myArr = nil;
编辑:@Sylvain击败了我:)非常感谢,但这不是酒店的问题。这是因为未正确实现的init方法导致了这个问题。这里的self是一个随机值。尽管如此,还是要谢谢你。非常感谢,但这不是物业的问题。这是因为未正确实现的init方法导致了这个问题。这里的self是一个随机值。尽管如此,还是要谢谢你。非常感谢,但这不是物业的问题。这是因为未正确实现的init方法导致了这个问题。这里的self是一个随机值。还是谢谢你。好的。这一切都是在。。。所以:)非常感谢,但这不是物业的问题。这是因为未正确实现的init方法导致了这个问题。这里的self是一个随机值。还是谢谢你。好的。这一切都是在。。。所以:)非常感谢,但这不是物业的问题。这是因为未正确实现的init方法导致了这个问题。这里的self是一个随机值。尽管如此,还是要谢谢你。非常感谢,但这不是物业的问题。这是因为未正确实现的init方法导致了这个问题。这里的self是一个随机值。尽管如此,还是要谢谢你。问题出在别处