Не позволяйте использовать - (id) init; метод - PullRequest
0 голосов
/ 30 июня 2011

Я разрабатываю приложение для 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 ]

5 голосов
/ 30 июня 2011

вызывает исключение, если кто-то использует простой init

- (id)init {
    [NSException raise:@"MBMethodNotSupportedException" format:@"\"- (id)init\" is not supported. Please use the designated initializer \"- (id)initWithNumShapes:screenSize:\""];
    return nil;
}
2 голосов
/ 30 июня 2011

Вы можете переопределить функцию init и дать ей значения по умолчанию, если у вас есть:

- (id)init {
    return [self initWith....];
}

Если вы вообще не хотите использовать init, все равно переопределите и сгенерируйте какое-то исключение, говорящее, что init не используется.

- (id)init {
    NSAssert(NO, @"Please use other method ....");
    return nil;
}

Это всегда даст исключение, если кто-нибудь попытается позвонить init.

Я бы предложил использовать первый случай и иметь некоторые значения по умолчанию.

0 голосов
/ 30 июня 2011

Это всегда одна и та же схема. Просто вызовите init для своего суперкласса (NSObject).

- (id) initWithNumShapes:(int)numShapes screenSize:(CGSize)screenSize {
     if(self == [super init]) {
          // Custom Init your properties
          myNumShapes = numShapes;
          myScreenSize = screenSize;
     }
     return self;
}
...