说我有这个班级
@interface CustomClass : NSObject @property (nonatomic,strong) NSArray * nicestArrayEver; @end
我想创建一个CustomClass的子类,但这里是catch
@interface ASubClassCustomClass : CustomClass @property (nonatomic,strong) NSMutableArray * nicestArrayEver; @end
你可以想象的问题是,当我初始化ASubClassCustomClass并调用它的超级初始化器(因为还需要其他属性)时,会创建不可变的nicestArrayEver ..我怎样才能避免它的创建,所以我可以设置可变的?
解决方法
您可以通过使用不同的后备变量使其工作,在合成它时如下所示:@synthesize nicestArrayEver = nicestArrayEverSubClass_;
#import <Foundation/Foundation.h> @interface CustomClass : NSObject @property (nonatomic,strong) NSArray * nicestArrayEver; @end @implementation CustomClass @synthesize nicestArrayEver ; -(id)init { if (self = [super init]) { nicestArrayEver = [[NSArray alloc] init]; } return self; } @end @interface ASubClassCustomClass : CustomClass @property (nonatomic,strong) NSMutableArray * nicestArrayEver; @end @implementation ASubClassCustomClass @synthesize nicestArrayEver = nicestArrayEverSubClass_; -(id)init{ if (self = [super init]) { nicestArrayEverSubClass_ = [[NSMutableArray alloc] init]; } return self; } @end int main(int argc,const char * argv[]) { @autoreleasepool { CustomClass *c1 = [[[CustomClass alloc] init] autorelease]; ASubClassCustomClass *c2 = [[[ASubClassCustomClass alloc] init] autorelease]; NSLog(@"%@",NsstringFromClass([[c1 nicestArrayEver] class])); NSLog(@"%@",NsstringFromClass([[c2 nicestArrayEver] class])); } return 0; }
产量
2012-05-27 01:59:16.221 NicestArray[2312:403] __NSArrayI 2012-05-27 01:59:16.225 NicestArray[2312:403] __NSArrayM
另一种方法可能是在基类中有两个init方法,一个用于实例化属性,另一个用于子类的任务 – 这将阻止你创建昂贵的对象只是为了抛出它们远.
现在,基类可以直接使用第二个init进行实例化,并进入false状态.您可以通过使用isMemberOfClass:检查自类类型来避免这种情况,如果类类型是基类,则抛出错误.
@interface CustomClass : NSObject @property (nonatomic,strong) NSArray * nicestArrayEver; -(id)initWithoutArray; @end @implementation CustomClass @synthesize nicestArrayEver ; -(id) initWithoutArray { if (self = [super init]) { if ([self isMemberOfClass:[CustomClass class]]) { [NSException raise:@"AbstractMethodCall" format:@"%@ should be called only from Subclasses of %@",NsstringFromSelector(_cmd),NsstringFromClass([self class])]; } } return self; } -(id)init { if (self = [super init]) { nicestArrayEver = [[NSArray alloc] init]; } return self; } @end @interface ASubClassCustomClass : CustomClass @property (nonatomic,strong) NSMutableArray * nicestArrayEver; @end @implementation ASubClassCustomClass @synthesize nicestArrayEver = nicestArrayEverSubClass_; -(id)init{ if (self = [super initWithoutArray]) { nicestArrayEverSubClass_ = [[NSMutableArray alloc] init]; } return self; } @end int main(int argc,NsstringFromClass([[c2 nicestArrayEver] class])); //this works,as it is the subclass ASubClassCustomClass *shouldWork = [[[ASubClassCustomClass alloc] init] autorelease]; // ouch! CustomClass *shouldCrash = [[[CustomClass alloc] initWithoutArray] autorelease]; } return 0; }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。