关联引用似乎可以解决问题。您基本上可以在类对象本身上添加一些存储。(我在NSString
这里使用 s 来代替您要使用的字典,仅用于演示。)
超类:
#import <Foundation/Foundation.h>
#import <objc/runtime.h>
@interface Stuper : NSObject
// Accessor method for the "class variable"
+ (NSString *) str;
// Analog to your +localStorePath
+ (NSString *) quote;
@end
#import "Stuper.h"
// The doc suggests simply using the address of a static variable as the key.
// This works fine, even though every class is (as in your problem) using
// the same key, because we are associating to a different class each time.
static char key;
@implementation Stuper
+ (NSString *) str {
NSString * s = objc_getAssociatedObject(self, &key);
if( !s ){
s = [self quote];
// You'll probably want to use OBJC_ASSOCIATION_RETAIN for your dictionary.
// self inside a class method is the class object; use that as
// the associator. The string is now tied to the associator, i.e.,
// has the same lifetime.
objc_setAssociatedObject(self, &key, s, OBJC_ASSOCIATION_COPY);
}
return s;
}
+ (NSString *) quote {
return @"It was the best of times, it was the worst of times.";
}
@end
子类:
#import "Stuper.h"
@interface Stub : Stuper @end
#import "Stub.h"
@implementation Stub
+ (NSString *) quote {
return @"Call me Ishmael.";
}
@end
试试这个:
#import <Foundation/Foundation.h>
#import "Stuper.h"
#import "Stub.h"
int main (int argc, const char * argv[])
{
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
NSLog(@"%@", [Stuper str]);
NSLog(@"%@", [Stub str]);
[pool drain];
return 0;
}
每个类对象现在都有自己的字符串,与之关联。
2011-12-05 23:11:09.031 SubClassVariables[36254:903] 这是最好的时代,也是最坏的时代。
2011-12-05 23:11:09.034 SubClassVariables[36254:903] 叫我 Ishmael。
唯一的缺点是每次需要对象时都必须调用访问器方法。您没有可以直接使用的指针。objc_getAssociatedObject
当然,您也可以将超类作为访问器调用,因为它可以访问key
.