在Objective-c中,如何使变量的作用域是整个类(但不包括子类)

在Objective-c中,如何使变量的作用域是整个类(但不包括子类),objective-c,xcode4.5,Objective C,Xcode4.5,我创建了大量的UITableViewCell子类。其中每一个都是另一个BGBaseTableViewCell类的子类 当被问及高度时,我认为告诉用户UITableViewCell的典型尺寸会很有用 一种方法是指定两次 一次是在我用xib设计UITableViewCell时,第二次是在我硬编码典型尺寸时 这是一个设计缺陷,因为当我更改xib中的内容时,我需要记住更改硬编码的典型大小 我不想那样。我想在xib中设计我的UITableViewCell,当类初始化时,我想存储默认高度 所有子类的默认高度

我创建了大量的UITableViewCell子类。其中每一个都是另一个BGBaseTableViewCell类的子类

当被问及高度时,我认为告诉用户UITableViewCell的典型尺寸会很有用

一种方法是指定两次

一次是在我用xib设计UITableViewCell时,第二次是在我硬编码典型尺寸时

这是一个设计缺陷,因为当我更改xib中的内容时,我需要记住更改硬编码的典型大小

我不想那样。我想在xib中设计我的UITableViewCell,当类初始化时,我想存储默认高度

所有子类的默认高度都需要不同。但是,该子类的所有实例都必须相同

如果我使用简单的ivar,那么我必须为所有实例存储一个默认大小

如果我使用静态变量,那么BGBaseTableViewCell中的静态变量将由它的所有子类使用

那我该怎么办

这就是我现在正在做的:

static CGFloat defaultHeightSet = 0; //this one is used by all subclasses. I want each subclass have it's own defaultHeightSet, but I want to specify that fact once.

+(void)initialize
{
    BGBaseTableViewCell * typical = [[self alloc]init];
    defaultHeightSet = typical.bounds.size.height;
}
+(CGFloat) defaultHeight
{
    return defaultHeightSet;
}

为什么我没想到呢

将静态变量设置为字典,并将类名设置为键:)

女士们,先生们,各个年龄段的孩子们。Sharen Eayrs产品自豪地展示了静态保护变量:

static NSMutableDictionary * defaultHeightDictionary= nil;
static NSMutableDictionary * defaultBoundsDictionary =nil;
//static CGFloat defaultHeightSet = 0;

+(void)initialize
{
    BGBaseTableViewCell * typical = [[self alloc]init];

    if (defaultHeightDictionary==nil) {
        defaultHeightDictionary = [NSMutableDictionary dictionary];
        defaultBoundsDictionary = [NSMutableDictionary dictionary];
    }
    [defaultHeightDictionary setValue:@(typical.bounds.size.height) forKey:NSStringFromClass([self class])];
    CGRect bounds = typical.bounds;

    NSValue * boundsValue = [NSValue valueWithCGRect:bounds];
    [defaultHeightDictionary setValue:boundsValue forKey:NSStringFromClass([self class])];


}
+(CGFloat) defaultHeight
{
    NSNumber * result = [defaultHeightDictionary valueForKey:NSStringFromClass([self class])];
    return result.floatValue;
}

+(CGRect) defaultBounds
{
    NSValue * result = [defaultBoundsDictionary valueForKey:NSStringFromClass([self class])];
    return [result CGRectValue];
}

在整个类中可见,但在子类中不可见?您可以为.m文件尝试以下代码:

@interface ClassYouNeed ()
static VariableClass* variableVisibleInClassButNotInSubclass;
@end

只要在实现附近的类上创建一个“隐藏”类别,就可以了。

实际上,您可以将类本身用作键,如下所示:
defaultHeightDictionary[(id)self]=boundsValue
。您不需要说
[self class]
,因为
self
已经是类对象,您不需要将其转换为字符串。您需要强制转换,因为字典键必须实现
NSCopying
协议。类对象确实实现了协议,但没有声明符合协议(因为语言中存在限制)。实际上,我尝试了NSStringFromClass(someClass)并遇到了问题。NSStringFromClass([someClass类])起作用,这就是混淆的地方。是否保证NSStringFromClass将始终为每个类返回唯一的字符串?(id)如何自行修复未声明符合NSCOPYNG协议的问题?我想我可以使用这种技术来维护我所有的单例类。哎呀,为什么没有人想到这样做呢?这将是每个实例的独立变量。