точка самостоятельной записи в nsxmlparser - PullRequest
0 голосов
/ 21 декабря 2011

Я только что прочитал ответ на другой вопрос о nsxmlparsing .. и в нем парень говорил, что вы должны использовать self. нотация для лучшего управления памятью ... что доза это значит?

Я исключил это из инициализации моего словаря, должен ли я его иметь? Как доза это помогает или не помогает?

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName attributes:(NSDictionary *)attributeDict 
{
    if ([elementName isEqualToString:@"Row"]) 
    {
        ICRow = [[NSMutableDictionary alloc] initWithDictionary:attributeDict];
    }
    if ([elementName isEqualToString:@"Rows"]) {
        self.ICRows = [NSMutableArray arrayWithCapacity:8];
    }
}

1 Ответ

2 голосов
/ 21 декабря 2011
bar = self.foo;

- это просто сокращенная запись для

bar = [self foo];

, а

self.foo = bar;

- сокращение для

[self setFoo:bar];

С точки зрения управления памятью это просто означает, что определенные установщики и получатели вызываются , тогда как

foo = bar

просто присвоит значение (т. е. в основном просто скопирует указатель).

Скажем, у вас естьсохраненное свойство

@property (nonatomic, retain) FooType *foo;
//...
@synthesize foo;

, тогда установщик может выглядеть следующим образом:

- (void) setFoo:(FooType*)x
{
 [x retain];
 [foo release];
 foo = x;
}

Теперь, если вы сделаете

FooType *newFoo = [[FooType alloc] init];
[self setFoo:newFoo];
// or self.foo = newFoo 

Все будет в порядке, поскольку ваш ранее выделенный объектосвобождается и новый объект сохраняется правильно.Если бы вы вместо этого просто сделали

foo = newFoo;

, не думая о том, чтобы освободить старый и сохранить новый объект, вы бы потеряли память или еще хуже ...

...