我一直在回顾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]创建的实例,那么如何在不为它们分配内存的情况下创建指针呢?
答案 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
框中,我们这样做了。这就是你需要知道的全部......
retain
这个方框,但这是另一个问题......
HTH。
答案 2 :(得分:0)
将NSInteger *myInt;
声明为NSInteger myInt;