TL; DR
Ответ - это не то, как вы определяете ivars в Objective-C. Я даже не уверен, как это должно себя вести, но я могу воспроизвести ошибку, если кодирую ее так же, как вы.
Мне было бы интересно, чтобы кто-то, обладающий большими знаниями, объяснил, каким должно быть поведение / область действия этих переменных, когда они определены, как у вас.
В этом коде много недостатков
Вы на самом деле не показали initPiece:
.
Длинный init...
со всеми аргументами, вероятно, плохая идея. Как правило, добавляйте вещи в init
только для удобства или если объект просто не может функционировать без него.
Использование get
не совсем правильно в Objective-C
Класс потенциально должен быть определен как
XMLLevelPiece.h
// You will need to import the header with the BlockTypeEnum defined
@interface XMLLevelPiece : NSObject
@property (nonatomic, assign) BlockTypeEnum blockType;
// .. Other properties
- (id)initWithPiece:(BlockTypeEnum)blockType; // I'm not so sure you need this
@end
XMLLevelPiece.m
#import "XMLLevelPiece.h"
#import "BlockType.h"
#import "GridCord.h"
#import "BlockColor.h"
@implementation XMLLevelPiece
@synthesize blockType = mBlockType;
- (id)initWithPiece:(BlockTypeEnum)blockType;
{
self = [super init];
if (self) {
mBlockType = blockType;
}
return self;
}
@end
Тогда вы можете использовать его как
BlockTypeEnum blockType = STRAIGHT;
XMLLevelPiece *p1 = [[XMLLevelPiece alloc] initWithPiece:blockType];
blockType = NINETYBEND_FAST;
XMLLevelPiece *p2 = [[XMLLevelPiece alloc] initWithPiece:blockType];
NSLog(@"%d", p1.blockType);
NSLog(@"%d", p2.blockType);
Что для меня приводит к:
2012-01-08 15:29:31.782 Untitled[1297:707] 3
2012-01-08 15:29:31.791 Untitled[1297:707] 1
Факультативные наблюдения
Если вы можете покончить с выделенным инициализатором, использование будет выглядеть примерно так:
BlockTypeEnum blockType = STRAIGHT;
XMLLevelPiece *p1 = [[XMLLevelPiece alloc] init];
p1.blockType = blockType;
// all other assignments
blockType = NINETYBEND_FAST;
XMLLevelPiece *p2 = [[XMLLevelPiece alloc] init];
p2.blockType = blockType;
// all other assignments
NSLog(@"%d", p1.blockType);
NSLog(@"%d", p2.blockType);
Чтобы удалить пару лишних строк, вы можете удалить локальную переменную blockType
и присвоить значение прямо объекту:
XMLLevelPiece *p1 = [[XMLLevelPiece alloc] init];
p1.blockType = STRAIGHT;