Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.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 在类或子类中调用Release?_Objective C_Memory Management - Fatal编程技术网

Objective c 在类或子类中调用Release?

Objective c 在类或子类中调用Release?,objective-c,memory-management,Objective C,Memory Management,我的基类具有子类使用的属性。应该在哪里发布?在原始基类或继承它的类中?我对Objective-C非常陌生,所以我也很好奇这里的最佳答案是什么。我认为应该在父类dealloc中将属性设置为nil,在父类dealloc中合成属性。如果出于某种原因将其保留在子类中,也应该在子类中释放它,但是在超类中将属性设置为nil应该不会有任何负面影响。我对Objective-C非常陌生,所以我也很好奇这里的最佳答案是什么。我认为应该在父类dealloc中将属性设置为nil,在父类dealloc中合成属性。如果出于

我的基类具有子类使用的属性。应该在哪里发布?在原始基类或继承它的类中?

我对Objective-C非常陌生,所以我也很好奇这里的最佳答案是什么。我认为应该在父类dealloc中将属性设置为nil,在父类dealloc中合成属性。如果出于某种原因将其保留在子类中,也应该在子类中释放它,但是在超类中将属性设置为nil应该不会有任何负面影响。

我对Objective-C非常陌生,所以我也很好奇这里的最佳答案是什么。我认为应该在父类dealloc中将属性设置为nil,在父类dealloc中合成属性。如果出于某种原因将其保留在子类中,也应该在子类中释放它,但是在超类中将属性设置为nil不会有任何负面影响。

我认为每个类都管理自己的属性。所以子类类应该释放它的属性,基类释放它自己的属性

一旦子类被释放,它将不会访问基类属性,从技术上讲它不再存在。dealloc的标准书写方式是:

- (void)dealloc
{
   // release my stuff, after this line
   // I don't exist and do not need to access any of my properties
   [super dealloc];
}

我想说的是,每个类都管理自己的属性。所以子类类应该释放它的属性,基类释放它自己的属性

一旦子类被释放,它将不会访问基类属性,从技术上讲它不再存在。dealloc的标准书写方式是:

- (void)dealloc
{
   // release my stuff, after this line
   // I don't exist and do not need to access any of my properties
   [super dealloc];
}

如果属性仅由子类使用,则应在子类而不是父类中定义它们,并且子类应在其-voiddealloc函数中释放它们。你会有这样的东西:

- (void)dealloc
{
   [username release];
   [password release];
   [super dealloc];
}

请注意,我们不会在属性上调用dealloc!我们只调用release,这意味着我们将不再使用它们,并且如果没有其他人使用它们,系统可以清理它们。

如果属性仅由子类使用,则它们应该在子类中定义,而不是在父类中,子类应该在其-voiddealloc函数中释放它们。你会有这样的东西:

- (void)dealloc
{
   [username release];
   [password release];
   [super dealloc];
}

请注意,我们不会在属性上调用dealloc!我们只调用release,这意味着我们将不再使用它们,并且如果没有其他人使用它们,系统可以清理它们。

在给定的块中,要保留、复制、分配的调用数量应该通过调用release、autorelease来平衡。 如果在子类中保留某些内容,请在子类中释放它,如果在基类中


我从一篇关于逐步的文章的记忆中解释了这一点。

在给定的块中,保留、复制、分配的调用数量应该通过释放、自动释放的调用来平衡。 如果在子类中保留某些内容,请在子类中释放它,如果在基类中


我从一篇关于逐步学习的文章的记忆中解释了这一点。

简短回答:在基类中

详细回答:对象由其他对象拥有。要拥有一个对象,您必须使用retain、alloc、new或copy来分配或保留它。所有者负责释放或自动释放内存。每个分配/保留应有一个释放/自动释放


按照惯例,只有以new和copy开头的方法才会返回已分配/复制/保留但不属于方法接收方的对象。然后,所有者就是调用new或copy函数的对象。

简短回答:在基类中

详细回答:对象由其他对象拥有。要拥有一个对象,您必须使用retain、alloc、new或copy来分配或保留它。所有者负责释放或自动释放内存。每个分配/保留应有一个释放/自动释放


按照惯例,只有以new和copy开头的方法才会返回已分配/复制/保留但不属于方法接收方的对象。然后,所有者就是调用new或copy函数的对象。

Apple说明您不应该在init/dealoc中使用属性设置器,因此您不应该将属性设置为nil,而应该简单地调用[ivar release]。如果您还需要将ivar设置为nil,那么您正在做一些错误的事情,应该予以纠正,例如删除计时器/观察值/不同的方法调用。Apple文档指出,您不应该在init/dealloc中使用属性设置器,因此您不应该将属性设置为nil,而只是调用[ivar release]。如果您还需要将ivar设置为nil,那么您做了一些错误,应该纠正这些错误,例如删除计时器/观察值/不同的方法调用。切勿重新表述内存管理规则。直接引用即可:。这些规则只有十几个句子,它们不需要解释。永远不要解释记忆管理规则。简单地重新
直接引用它们:。规则只有十几句话,不需要解释。同意。这一直是我在OO编程中的规则,无论使用哪种语言。属性是基于所有权的,就像Objective-C内存管理一样——两者几乎总是一个,因为属性本质上是访问实例变量的好方法。始终在声明IVAR的类中释放IVAR,如果它有任何子类,则永远不要在其任何子类中释放IVAR。这基本上是相同的匹配retain和release调用的模式。这一直是我在OO编程中的规则,无论使用哪种语言。属性是基于所有权的,就像Objective-C内存管理一样——两者几乎总是一个,因为属性本质上是访问实例变量的好方法。始终在声明IVAR的类中释放IVAR,如果它有任何子类,则永远不要在其任何子类中释放IVAR。它本质上是相同的匹配retain和release调用的模式。