我分配/释放什么对象

时间:2010-03-04 14:04:39

标签: objective-c alloc

在Objective-C中简单地说 - 假设

我是否正确
  1. 所有指针变量在不再使用时必须释放?
  2. 每个指针变量(*)都是某种类,不是吗?
  3. 因此需要使用“alloc”和“init”(或类似的)分配和初始化每个指针变量?
  4. 使用Object方法声明变量时,我可能不需要“alloc”或“init”?
  5. 数字声明(BOOL,int,float等)只要它们没有被声明为指针就不需要内存管理吗?
  6. 感谢任何有助于解决我的困惑的建议    iFloh

3 个答案:

答案 0 :(得分:3)

  

1)所有指针变量必须是   他们没有被使用时被释放   更?

这取决于你“拥有”尖锐的东西。我建议您仔细阅读这些Memory Management规则,以了解如何释放指针。

  

2)每个指针变量(*)都是一个类   某种,不是吗?

不是每一个指针。指针变量可以保存指向对象或存储器块的指针。它只是指向某事物的指针。

  

3)因此每个指针变量都需要   使用分配和初始化   “alloc”和“init”(或类似的)?

不是每一个指针。指针变量可以保存指向对象或存储器块的指针。指向的东西可以是已经存在的对象或分配的内存块。

  

4)使用Object声明变量时   方法我可能不需要“alloc”或   “初始化”?

不是每次都是。您可能会获得指向现有对象的指针,而无需知道谁分配并初始化它。同样,还有一些所有权规则要遵循。我建议您仔细阅读这些Memory Management规则。

  

5)数字声明(BOOL,int,float,   等)不需要内存管理   只要他们没有被宣布为   指针?

是。有一种叫做原始类型,只要你把它们作为值来操作,你就不必处理它们的内存管理。

答案 1 :(得分:2)

  

所有指针变量在不再使用时必须释放?

仅当“指针变量”指向Objective-C类的实例时,并且仅当您导致先前保留该实例时。 Read this: Memory Management Guide

  

每个指针变量( **)都是某种类,不是吗?*

如果指针变量被声明为指向类实例的指针,那么它将指向类的实例。否则,它不会。指针就是这样;一个指针 - 一个引用 - 一块内存。那块内存可能是一个类,一个类的实例,一个C结构,或一个原始缓冲区(或其他东西)。

  

因此需要使用“alloc”和“init”(或类似的)分配和初始化每个指针变量?

仅当指针指向Objective-C类的实例时。如果它是C结构,您可以使用malloc()。即使在Objective-C类的情况下,您可能不会alloc任何事情:

NSString * foo = [NSString stringWithFormat:@“Hello,%@”,@“World!”]; NSString * bar = @“bar”; NSBundle * main = [NSBundle mainBundle];

(顺便说一句:以上都不需要-release。)

  

使用Object方法声明变量时,我可能不需要“alloc”或“init”?

这个问题表明你应该阅读 - 并重新阅读(我在第一个十年中每隔18个月阅读一次,我写了Objective-C代码,每次都学习一些东西) - the Objective-C language guide

您可能还应该阅读有关C语言本身的内容。这可能有助于您理解指针与其他类型。

  

数字声明(BOOL,int,float等)只要它们没有被声明为指针就不需要内存管理吗?

是的,但它比特定类型更简单。当你说int foo;时,你告诉编译器在局部作用域中创建一些空间 - 通常是堆栈 - 来存储一个int的数据。当你说int *foo;时,你告诉编译器在本地范围内划出一些空间来存储指针 - 存储地址 - 在一个包含int的内存中。

因此,NSArray *bar只是指向实例的指针,是的,NSArray bar;,如果未明确禁止,则会在堆栈上划出一大块空间来容纳NSArray实例。

当你有一个东西的指针时必须以某种方式初始化某些东西,这通常是通过分配完成的(但并非总是如此)。

答案 2 :(得分:0)

我相信你是对的:

  1. 我想。我不确定我理解这个问题。

  2. 有点:如你所说,如果你使用某些Class方法,则不一定是alloc + init。因此,分配和初始化是隐式完成的。

  3. 正确。 (见上文)

  4. 我认为这不仅仅是数字,C基元不需要内存管理。

  5. 我建议您阅读memory management rules from Apple以及Stanford class on iPhone Programming