代码之家  ›  专栏  ›  技术社区  ›  MikeyWard

目标C中的静态nsstring

  •  6
  • MikeyWard  · 技术社区  · 15 年前

    我经常在类实例方法中看到这样的代码片段:

    static NSString *myString = @"This is a string.";
    

    我似乎不明白为什么会这样。这仅仅是一个定义的objc等价物吗?定义仅限于方法的范围?我(认为)我理解变量的静态性质,但更具体地说,关于nsstrings,为什么不分配它,init'd?

    谢谢~

    5 回复  |  直到 13 年前
        1
  •  1
  •   vodkhang    15 年前

    对于nsstring alloc部分,init:

    我认为,首先,它可以被认为是一种便利,但它与[[nsstring alloc]init]不同。

    我在这里找到了一个有用的链接。你可以看看那个 NSString and shortcuts

    对于静态和定义部分:

    类中的静态实例意味着您可以使用类的任何实例进行访问。您可以更改static的值。对于函数,这意味着变量的值在函数调用之间保留

    #define是放置一个宏常量以避免使用幻数和字符串,并定义函数宏。#定义最大值100。然后您可以使用int a[max_mumber]。编译代码时,它将被复制并粘贴到int a[100]

        2
  •  9
  •   harms    15 年前

    我认为这个问题有两个不相关的部分。

    一个是它为什么不被分配和初始化,答案是当你写一个 @"foo" 形式,Objective-C编译器将创建一个 NSString 举个例子。

    另一个问题是 static 修饰符。它与C函数的作用相同,确保 myString 每次使用方法时变量都是相同的(即使在不同的对象实例之间)。

    #define 宏是完全不同的:它是源代码的“编程剪切和粘贴”,在代码到达编译器之前执行。

        3
  •  4
  •   ksm    13 年前

    只是偶然发现了同样的 static NSString 宣言。我想知道这种静态魔法是如何工作的,所以我读了一些。我只想回答你问题的静态部分。

    根据 K&R C中的每个变量都有两个基本属性: 类型 (例如浮球)和 存储类 (自动、寄存器、静态、外部、typedef)。

    这个 静止的 存储类有两种不同的效果,具体取决于它是否被使用:

    • 在一个代码块内部(例如,在函数内部),
    • 在所有块之外(与函数处于同一级别)。

    变量 街区内 它没有声明它的存储类,默认情况下被认为是自动的(即它是本地的)。一旦该块退出,它将被删除。当您将自动变量声明为静态变量时,它将在退出时保留其值。当代码块再次被调用时,该值仍然存在。

    全局变量(与函数在同一级别声明)始终是静态的。将全局变量(或函数)显式声明为 静止的 将其范围仅限于单个源代码文件。它将无法从访问,也不会与其他源文件冲突。这叫做 内部联动装置 .

    如果你想了解更多,请继续阅读 internal and external linkage in C .

        4
  •  2
  •   mipadi    15 年前

    你看不到呼叫 alloc / init 因为 @"..." 构造创建一个 常数 内存中的字符串(通过编译器)。

    在这种情况下, static 意味着无法从定义变量的文件中访问该变量。

        5
  •  1
  •   Michael Chinen    15 年前

    这是nsstring的一个特殊情况in it case,它只将nsstring指针指向在启动时分配并初始化的实例(我不确定,可能是延迟的)。对于您在程序中使用的每个唯一@“”,都有一个以这种方式创建的nsstring实例。

    我也认为这是真的,即使你不使用静态关键字。此外,我认为用该字符串初始化的所有其他nsstring都将指向同一个实例(这不是问题,因为它们是不可变的)。

    它与define不同,因为通过使用=@“whatever”初始化创建字符串,实际上有一个nsstring变量。它似乎更等同于C's const char* somestr = "blah blah blah" .

    推荐文章