指针类,但尚未分配?

时间:2012-08-11 06:19:18

标签: objective-c memory pointers instance

我一直在回顾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]创建的实例,那么如何在不为它们分配内存的情况下创建指针呢?

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

不知道你的困惑在哪里我会从简单的开始,通常称为变量,如果这太基础,我会道歉。

当你写:

NSInteger someNumber;

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

同样当你写:

NSNumber *intNumber;

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

答案 2 :(得分:0)

NSInteger *myInt;声明为NSInteger myInt;