我正在开发适用于iPhone 3.1.3的应用程序。
我有以下课程:
@interface Pattern : NSObject {
NSMutableArray* shapes;
NSMutableArray* locations;
CGSize bounds;
}
@property (nonatomic, retain, readonly) NSMutableArray* shapes;
@property (nonatomic, retain, readonly) NSMutableArray* locations;
- (id) initWithNumShapes:(int)numShapes screenSize:(CGSize)screenSize;
- (void) addObject:(Object2D*) newObject;
@end
我不想让程序员使用-(id)init;
,因为我需要在每次初始化时设置我的字段(形状,位置,边界)。
我不想让程序员使用它:
Pattern* myPattern = [[Pattern alloc] init];
我知道如何实施:
- (id) initWithNumShapes:(int)numShapes screenSize:(CGSize) screenSize{
if (self = [super init]) {
shapes = [NSMutableArray arrayWithCapacity:numShapes];
locations = [NSMutableArray arrayWithCapacity:numShapes];
bounds = screenSize;
}
return (self);
}
我该怎么做?
答案 0 :(得分:5)
如果某人使用普通init
- (id)init {
[NSException raise:@"MBMethodNotSupportedException" format:@"\"- (id)init\" is not supported. Please use the designated initializer \"- (id)initWithNumShapes:screenSize:\""];
return nil;
}
答案 1 :(得分:2)
如果你有:
,你可以覆盖init函数并从中给出默认值- (id)init {
return [self initWith....];
}
如果你根本不想要init,仍然会覆盖并抛出某种异常,说不要使用init。
- (id)init {
NSAssert(NO, @"Please use other method ....");
return nil;
}
如果有人试图致电init
,这将始终发出异常。
我建议使用前一种情况,并有一些默认值。
答案 2 :(得分:0)
它始终是相同的架构。只需在你的超类(NSObject)上调用init。
- (id) initWithNumShapes:(int)numShapes screenSize:(CGSize)screenSize {
if(self == [super init]) {
// Custom Init your properties
myNumShapes = numShapes;
myScreenSize = screenSize;
}
return self;
}