【问题标题】:Pointer Class, yet not Allocated?指针类,但尚未分配?
【发布时间】:2012-08-11 06:19:18
【问题描述】:

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

【问题讨论】:

    标签: objective-c memory pointers instance


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      不知道你的困惑在哪里,我将从简单的boxes开始,通常称为variables,如果这太简单了,请道歉。

      当你写作时:

      NSInteger someNumber;
      

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

      写作时也是如此:

      NSNumber *intNumber;
      

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

      【讨论】:

        【解决方案3】:

        NSInteger *myInt; 声明为NSInteger myInt;

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-03-31
          • 2015-07-14
          • 1970-01-01
          • 2014-06-03
          • 1970-01-01
          • 2021-11-05
          • 2020-09-25
          • 1970-01-01
          相关资源
          最近更新 更多