Существуют ли все еще известные утечки памяти с XMLSerialization в.Net 3.5?

Сначала установите глобальную переменную int:

@interface TableViewController () {

    int arrNum;
}

@end

@implementation TableViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    arrNum = 3;

}

Затем установите количество разделов:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {

    return 2;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {

    if (section == 0){
        return arrNum;
    }else {
        return 5;
    }

}

Затем создайте кнопку в нижнем колонтитуле раздела:

-(UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section {

    UIButton *btn = [[UIButton alloc]init];
    [btn setTitle:@"btn Click" forState:UIControlStateNormal];
    [btn setBackgroundColor:[UIColor blueColor]];
    [btn addTarget:self action:@selector(btnClk) forControlEvents:UIControlEventTouchDown];
    return btn;
}

Теперь установите необходимое действие при нажатии кнопки:

-(void)btnClk {

    arrNum = arrNum + 2;
    dispatch_async(dispatch_get_main_queue(), ^{
        [self.tableView reloadData];
    });

}
5
задан dustinson 22 January 2009 в 13:23
поделиться

4 ответа

Это в основном решено через.NET 2.0 DynamicMethod. Однако существует все еще вид отказа, если Вы не используете [XmlRoot] атрибут. Рассмотрите эту статью для деталей.

2
ответ дан 18 December 2019 в 14:52
поделиться

Часть, которая на самом деле вызывает утечку, - то, что блоки, сгенерированные механизмом XML в целях сериализации, никогда не собираются. С CLR 2.0SP1 (.Net 3.5) это все еще имеет место. После того как блок загружается в процесс, он не будет удален, пока AppDomain, содержащий тот блок, также не разгружен.

Если Вы замечаете у основания статьи, хотя, она упоминает способ заставить механизм XML снова использовать блоки, таким образом, память не выйдет из-под контроля.

7
ответ дан 18 December 2019 в 14:52
поделиться

Я столкнулся с той же проблемой с 2,0, таким образом, я могу подтвердить, что утечка памяти все еще существует там, но у меня нет опыта с 3,5. Пока Вы только используете конструкторов XmlSerializer (тип) и XmlSerializer (тип, defaultNameSpace) необходимо быть в безопасности, поскольку XmlSerializers будет автоматически кэшироваться. При использовании какого-либо из других конструкторов, необходимо будет создать собственный кэш.

2
ответ дан 18 December 2019 в 14:52
поделиться

Спасибо. Появляется, как будто ключ должен использовать XmlSerializer (тип) и позволить экземпляру в оперативной памяти оставаться кэшируемым. Кажется, что при искажении имени класса, кэш не работает, и утечки следуют.. Я должен буду протестировать и контролировать для знания наверняка, если мы без утечки. - Dustin

2
ответ дан 18 December 2019 в 14:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: