iOS中的静态常量变量的子类化问题

时间:2012-02-04 01:55:13

标签: objective-c ios

我有A级和B级。

B类子类A类 A类具有静态常量NSString变量

在B类方法中,我需要使用Class A的静态常量NSString变量。我有哪些选择?

我尝试再次声明同样的事情,但导致问题(内部不一致),尝试不使用(说,变量未声明)。

知道如何解决这个问题吗?

感谢。

5 个答案:

答案 0 :(得分:8)

使类方法返回该常量,如下所示:

+(NSString*) constString {
    return myConstString;
}

答案 1 :(得分:4)

您可以在.h文件中声明静态常量字符串。这样它们是公共的,可以被导入头文件的其他类使用,包括你的子类。

或者,您可以使用extern:

声明对B类中字符串的引用
extern NSString *const MyString;

这基本上告诉编译器该字符串的值是在代码中的其他位置定义的,并且不必担心它。

答案 2 :(得分:3)

通过“A类有一个静态常量NSString变量”,我假设您指的是类A .m文件中定义的类似内容:

static NSString * const MyString = @"MyString";

@implementation ClassA

@end

要允许A类及其子类查看值,您可以执行以下操作:

MDClassAPrivate.h:

#import <Foundation/Foundation.h>

static NSString * const MDBlahBlahKey = @"MDBlahBlah";

MDClassA.h:

#import <Foundation/Foundation.h>

@interface MDClassA : NSObject {

}

@end

MDClassA.m:

#import "MDClassA.h"
#import "MDClassAPrivate.h"

@implementation MDClassA

@end

MDClassB.h:

#import "MDClassA.h"

@interface MDClassB : MDClassA {

}

@end

MDClassB.m:

#import "MDClassB.h"
#import "MDClassAPrivate.h"

@implementation MDClassB

@end

通过将静态const变量移动到单独的文件,您可以允许任何类在实现文件中导入它们。

答案 3 :(得分:1)

我对这个问题的个人解决方案是一个伪保护方法,它返回常量字符串。

// ClassA.m

@interface ClassA ()

- (NSString *)constantString;

@end

@implementation ClassA

- (NSString *)constantString {

    return @"MyConstantString";
}

@end

然后继续进入你的子类:

// ClassB.m

@interface ClassA ()

// This is a method redeclaration to avoid build warnings
- (NSString *)constantString;

@end

@implementation ClassB

- (void)someMethod {

    NSString *theConstantString = [self constantString];

    // do stuff...
}

@end

这里的假设是你的常量字符串确实是常量,如果你想要它是动态的,你需要稍微修改这个解决方案,但它仍然可以处理它。

答案 4 :(得分:1)

您可以使用'userDefaults'设置整个应用程序中可访问的值。

[[NSUserDefaults standardUserDefaults] setObject:object forKey:@"objectKey"];