Должен ли я использовать метод доступа в делегированном методе от init? - PullRequest
0 голосов
/ 11 августа 2011

Должен ли я использовать методы доступа или получить прямой доступ к iVars?:

- (id)initWithData: (NSData *)someData;
{
    if (self = [super init]) {
        NSXMLParser *parser = [[NSXMLParser alloc] initWithData: someData];
        [parser setDelegate: self];
        [parser parse];
        [parser release];
    }
    return self;
}

- (void)parser: (NSXMLParser *)parser didStartElement: (NSString *)elementName namespaceURI: (NSString *)namespaceURI qualifiedName: (NSString *)qName attributes: (NSDictionary *)attributeDict
{
    [self setValue: someValue]; // Setting an iVar of self
    [[self value] setOtherValue: otherValue]; // Setting an iVar of an object that's an iVar of self
}

Ответы [ 2 ]

0 голосов
/ 11 августа 2011

Это небезопасно, если вы не очень осторожны. Представьте себе следующий сценарий:

@interface BaseClass : NSObject
@property (readwrite) NSInteger twists;
@end

@interface SubClass : BaseClass {
    struct something *aField;
}
@end

@implementation BaseClass
- (id)init {
    self = [super init];

    if (self) {
        self.twists = 100;
        // or
        [self setTwists:100];
    }

    return self;
}

@synthesize twists;
@end

@implementation SubClass
- (id)init {
    self = [super init];

    if (self) {
        aField = malloc(sizeof(struct something));
    }

    return self;
}

- (void)dealloc {
    free(aField);
    [super dealloc];
}

- (void)setTwists:(NSInteger)value {
    [super setTwists:value];
    aField->twists++;
}
@end

Если используется SubClass, при создании экземпляра будет вызываться его реализация -setTwists:, что будет разыменовываться aField. В этот момент его инициализатор не был выполнен; инициализатор его суперкласса все еще выполняется. Сбой программы при разыменовании указателя NULL.

0 голосов
/ 11 августа 2011

Как правило, я считаю, что вы должны.До появления определений @property и некоторых новых ARC-компонентов для управления памятью это могло быть более спорным.Однако использование таких вещей, как объявления «@property (retain)» в заголовочном файле, действительно помогает убедиться, что соглашения о сохранении / выпуске соблюдаются должным образом и даже автоматизированы в случае ARC.

...