0

在Objective-C中,简单地说 - 我假设时是否正确

  1. 所有指针变量在不再使用时都必须释放?
  2. 每个指针变量(*)都是某种类,或者不是?
  3. 因此,每个指针变量都需要使用“alloc”和“init”(或类似的)进行分配和初始化吗?
  4. 使用 Object 方法声明变量时,我可能不需要“alloc”或“init”?
  5. 数字声明(BOOL、int、float 等)只要不声明为指针就不需要内存管理?

感谢您提供任何有助于解决我的困惑的建议 iFloh

4

3 回答 3

3

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

这取决于您是否“拥有”尖锐的东西。我建议您仔细阅读这些内存管理规则以了解如何释放指针。

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

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

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

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

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

不是每次。您可能会在不知道是谁分配和初始化它的情况下获得指向现有对象的指针。同样,需要遵循一些所有权规则。我建议您仔细阅读这些内存管理规则。

5) 数字声明(BOOL、int、float 等)只要不声明为指针就不需要内存管理?

是的。有称为原始类型,只要您将它们作为值进行操作,您就不必处理它们的内存管理。

于 2010-03-04T17:02:46.427 回答
2

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

仅当“指针变量”指向 Objective-C 类的实例并且仅当您使该实例先前被保留时。 阅读:内存管理指南

每个指针变量( **)都是某种类型的类,或者不是?*

如果指针变量被声明为指向类实例的指针,那么它将指向类的实例。否则,它不会。指针就是这样;一个指针——一个引用——指向一块内存。那块内存可能是一个类、一个类的实例、一个 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”?

这个问题表明你应该阅读——并重新阅读(在我编写 Objective-C 代码的第一个十年中,我大约每 18 个月阅读一次,每次都学习一些东西)—— Objective-C 语言指南

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

数字声明(BOOL、int、float 等)只要不声明为指针就不需要内存管理?

是的,但它比特定类型要简单得多。当您说int foo;您是在告诉编译器在本地范围内(通常是在堆栈上)开辟一点空间来存储 int 的数据时。当你说的时候int *foo;,你是在告诉编译器在本地范围内开辟出一点空间来存储一个指针——存储地址——内存中包含一个 int 的位置。

因此,NSArray *bar它只是一个指向实例的指针,是的NSArray bar;,如果它没有被明确禁止,它将在堆栈上开辟一块空间来保存一个 NSArray 实例。

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

于 2010-03-04T16:56:47.580 回答
0

I believe you are correct:

  1. Yes.

  2. I guess. I'm not sure I understand the question.

  3. Kind of: as you said, it's not necessarily alloc+init, if you use certain Class methods. So, the allocation and initialization are done implicitly.

  4. Correct. (see above)

  5. I believe that it's more than numbers and that C primitives do not require memory management.

I'd recommend that you read the memory management rules from Apple as well as the Stanford class on iPhone Programming.

于 2010-03-04T16:01:57.330 回答