【问题标题】:Static string variable in Objective C on iphoneiphone上Objective C中的静态字符串变量
【发布时间】:2009-06-11 09:03:27
【问题描述】:

如何在 iPhone 中创建和访问静态字符串(目标 c)? 我在 A 类中声明 static NSString *str = @"OldValue"

如果我在 B 类中将一些值分配给 str = @"NewValue"。 这个值对于 B 类中的所有方法都保持不变。但是如果我在 C 类中访问它(在 B 中分配之后),我将它作为 OldValue 获取。 我错过了什么吗?我应该在其他课程中使用 extern 吗?

感谢和问候, 瑜伽士

【问题讨论】:

    标签: iphone objective-c string static


    【解决方案1】:

    更新:从 Xcode 8 开始,Objective-C 确实具有类属性。注意,它主要是语法糖;这些属性不是自动合成的,所以实现与以前基本没有变化。

    // MyClass.h
    @interface MyClass : NSObject
    @property( class, copy ) NSString* str;
    @end
    
    // MyClass.m
    #import "MyClass.h"
    
    @implementation MyClass
    
    static NSString* str;
    
    + (NSString*) str 
    {
        return str;
    }
    
    + (void) setStr:(NSString*)newStr 
    {
        if( str != newStr ) {
            str = [newStr copy];
        }
    }
    @end
    
    
    // Client code
    MyClass.str = @"Some String";
    NSLog( @"%@", MyClass.str ); // "Some String"
    

    WWDC 2016 What's New in LLVM。类属性部分在 5 分钟左右开始。

    原答案:

    Objective-C 没有类变量,我认为这是您正在寻找的。你可以用静态变量来伪造它,就像你正在做的那样。

    我建议将静态 NSString 放在类的实现文件中,并提供类方法来访问/改变它。像这样的:

    // MyClass.h
    @interface MyClass : NSObject {
    }
    + (NSString*)str;
    + (void)setStr:(NSString*)newStr;
    @end
    
    // MyClass.m
    #import "MyClass.h"
    
    static NSString* str;
    
    @implementation MyClass
    
    + (NSString*)str {
        return str;
    }
    
    + (void)setStr:(NSString*)newStr {
        if (str != newStr) {
            [str release];
            str = [newStr copy];
        }
    }
    @end
    

    【讨论】:

      【解决方案2】:

      与 Java 不同,静态变量的作用域是类的所有实例,C 中的static 意味着变量只能从声明它的文件中访问。它允许你做一些事情,比如在函数中声明一个静态变量,它只在第一次设置值,like this

      你没有提到的一点是类A、B和C之间的关系。如果它们在继承层次结构中,并且你期望静态变量像在Java中那样被继承,那么zpasternack 会起作用的。

      如果这三个类不相关,而您只想访问 A 中声明的值,那么extern 是一种更合适的方式。在这种情况下,您想在 ClassA.h 中将变量声明为 extern,然后在 Class.m 中定义它。只要 ClassB 和 ClassC 导入 ClassA.h,它们就可以链接到相同的外部定义。

      一个很好的地方是,与其单独使用extern,不如使用OBJC_EXPORT,它在objc-api.h 中定义并处理在C++ 下的编译。这是一个代码示例:

      // ClassA.h
      OBJC_EXPORT NSString* commonString;
      ...
      
      // ClassA.m
      NSString* commonString = @"OldValue";
      
      // ClassB.m
      #import "ClassA.h"
      ...
      commonString = @"NewValue"; // Can be inside a function or method
      

      当然,以这种方式使用外部变量会创建一个臭名昭著的、饱受诟病的全局变量,它很脆弱,任何人都可以读取或写入它,并且访问不受控制。这是一种简单的方法,可以回答您关于使用staticextern 的问题。然而,作为一种设计原则,通过使用类方法包装变量所提供的封装更加安全,尽管更加复杂。在面向对象的语言中,当您想要达到的效果是类静态方法时,封装可能是正确的方法。

      【讨论】:

      • 我们应该使用OBJC_EXPORT 还是OBJC_EXTERN
      猜你喜欢
      • 2010-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-14
      • 2011-08-27
      • 2012-01-26
      • 2013-04-01
      • 1970-01-01
      相关资源
      最近更新 更多