在Objective-c中,如何使变量的作用域是整个类(但不包括子类)
我创建了大量的UITableViewCell子类。其中每一个都是另一个BGBaseTableViewCell类的子类 当被问及高度时,我认为告诉用户UITableViewCell的典型尺寸会很有用 一种方法是指定两次 一次是在我用xib设计UITableViewCell时,第二次是在我硬编码典型尺寸时 这是一个设计缺陷,因为当我更改xib中的内容时,我需要记住更改硬编码的典型大小 我不想那样。我想在xib中设计我的UITableViewCell,当类初始化时,我想存储默认高度 所有子类的默认高度都需要不同。但是,该子类的所有实例都必须相同 如果我使用简单的ivar,那么我必须为所有实例存储一个默认大小 如果我使用静态变量,那么BGBaseTableViewCell中的静态变量将由它的所有子类使用 那我该怎么办 这就是我现在正在做的:在Objective-c中,如何使变量的作用域是整个类(但不包括子类),objective-c,xcode4.5,Objective C,Xcode4.5,我创建了大量的UITableViewCell子类。其中每一个都是另一个BGBaseTableViewCell类的子类 当被问及高度时,我认为告诉用户UITableViewCell的典型尺寸会很有用 一种方法是指定两次 一次是在我用xib设计UITableViewCell时,第二次是在我硬编码典型尺寸时 这是一个设计缺陷,因为当我更改xib中的内容时,我需要记住更改硬编码的典型大小 我不想那样。我想在xib中设计我的UITableViewCell,当类初始化时,我想存储默认高度 所有子类的默认高度
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协议的问题?我想我可以使用这种技术来维护我所有的单例类。哎呀,为什么没有人想到这样做呢?这将是每个实例的独立变量。