Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/css/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective-C内存管理之谜_Objective C - Fatal编程技术网

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];

//...
}
使用生成的setter
self.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];

//...
}
使用生成的setter
self.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是一个随机值。尽管如此,还是要谢谢你。问题出在别处