不要让使用 - (id)init;方法

时间:2011-06-30 08:21:35

标签: objective-c iphone-sdk-3.0 init

我正在开发适用于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);
}

我该怎么做?

3 个答案:

答案 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;
}