当前位置:  开发笔记 > IOS > 正文

iphone中Objective C中的静态字符串变量

如何解决《iphone中ObjectiveC中的静态字符串变量》经验,为你挑选了2个好方法。

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

如果我在B类中为此分配一些值str = @"NewValue".对于B类中的所有方法,此值仍然存在.但是如果我在C类中访问它(在B中赋值后),我将其作为OldValue获取.我错过了什么吗?我应该在其他课程中使用extern吗?

谢谢和问候,Yogini



1> zpasternack..:

更新:从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 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> Quinn Taylor..:

与Java不同,静态变量的范围适用于类的所有实例,static而C表示只能从声明它的文件中访问变量.它允许你做一些事情,比如在函数内部声明一个静态变量,它只在第一次设置值,就像这样.

你没有提到的一件事是类A,B和C之间的关系.如果它们在继承层次结构中,并且你期望静态变量像在Java中一样继承,那么zpasternack描述的方法将起作用.

如果这三个类是不相关的,并且您只想访问A中声明的值,那么这extern是一种更合适的方法.在这种情况下,您希望extern在ClassA.h中声明变量,然后在Class.m中定义它.只要ClassB和ClassC导入ClassA.h,它们就能够链接相同的extern定义.

一个优点是,它不是单独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

当然,以这种方式使用externed变量会创建一个臭名昭着,备受诟病的全局变量,这个变量很脆弱,因为任何人都可以读取或写入它,并且访问是不受控制的.这是一种简单的方法,并回答了关于使用staticvs. 的问题extern.但是,作为一种设计原则,通过使用类方法包装变量而提供的封装更安全,尽管更复杂.在面向对象语言中,当您尝试实现的效果是类静态方法时,封装可能是正确的方法.

推荐阅读
凹凸曼00威威_694
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有