0

我一直在回顾 Kochan 的优秀 Objc-C 书中的一些基本 Objective C 笔记,我注意到其中一个指针是从一个类创建的,但不是手动分配的代码,例如:

//...

int main (int argc, char *argv[])
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSNumber *myNumber, *floatNumber, *intNumber;
NSInteger *myInt; 

//integer value

intNumber = [NSNumber numberWithInteger: 100];
myInt = [intNumber integerValue];
NSLog (@"%li", (long) myInt);

//...

请注意在没有“[[class allocate] init]”的情况下创建的所有实例,那么如何在不为它们分配内存的情况下创建指针呢?

4

3 回答 3

1

不知道您的困惑在哪里,我将从简单的开始,通常称为变量,如果这太基本了,请道歉。

当你写:

NSInteger someNumber;

您正在分配一个适合存储 an的盒子NSINteger,并要求通过名称引用该盒子someNumber- 该盒子还有另一个名称,通常称为其地址指针。所以你已经为一个整数分配了空间。

同样,当你写:

NSNumber *intNumber;

您正在分配一个适合存储的NSNumber *- 这是指定您希望此框包含其他框的名称(地址)的方式 - 并要求此框由名称引用intNumber。所以你已经为指针分配了空间,你没有分配的是一个盒子,它存储一个NSNumber(注意 no *),你可以存储它的名字(或地址指针intNumber) 。

现在这一行:

releasePool *pool = [[NSAutoreleasePool alloc] init];

做两件事。左边和前两个例子完全一样,它分配了一个盒子,给它一个方便的名字pool,这个盒子适合存放保存NSAutoreleasePool值的盒子的名字。

现在右边的大小是一个表达式,它使用 分配alloc一个适合保存NSAutoreleasePool值的盒子;init使用;将值放入该框中 然后返回框的名称

最后,分配采用 RHS 返回的名称并将其放入 LHS 创建的框中。

因此,总体而言,该声明创建了两个框。

这让我们了解您的:

intNumber = [NSNumber numberWithInteger: 100];

此处 LHS 指定了一个已创建的框。RHS 是一个返回框名的表达式。RHS 方返回其名称的框是在哪里创建的?我们只能真正猜测(numberWithInteger当然,除非我们有来源),这没关系 - 盒子是由某人在某个时候创建​​的,表达式返回它的名称。分配将我们没有分配的盒子的名称放入我们分配的intNumber盒子中。这就是你需要知道的一切......

差不多吧。如果您使用的是 ARC 或 GC,您可以在此处停止。如果您使用的是 MRC,您需要知道是否使用retain该框,但这是另一个问题......

HTH。

于 2012-08-11T06:49:07.287 回答
1

诸如为对象[NSNumber numberWithInteger: 100]分配内存的方法NSNumber。按照惯例,这种类方法等价于[[[NSNumber alloc] initWithInteger: 100] autorelease]. 与普通 alloc/init 习惯用法的不同之处在于它返回了一个您不拥有的对象。下次通过运行循环时,它将自动为您释放。请注意,仅当您不使用自动引用计数 (ARC) 时才会出现这种差异。在手动引用计数环境中,以这种方式创建临时对象通常非常方便,以便仅在您创建它们的例程中使用,而无需release稍后记住它们。您可以在 Apple 的内存管理编程指南中阅读更多关于 Objective C 内存管理的信息。

于 2012-08-11T06:44:34.093 回答
0

声明NSInteger *myInt;_NSInteger myInt;

于 2012-08-11T06:47:17.397 回答