Чтение онлайн

на главную

Жанры

iOS. Приемы программирования

Нахавандипур Вандад

Шрифт:

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

— (void) autoreleaseThread:(id)paramSender{

NSBundle *mainBundle = [NSBundle mainBundle];

NSString *filePath = [mainBundle pathForResource:@"AnImage"

ofType:@"png"];

UIImage *image = [UIImage imageWithContentsOfFile: filePath];

/* Делаем
что-нибудь с изображением. */

NSLog(@"Image = %@", image);

}

— (void)viewDidLoad {

[super viewDidLoad];

[NSThread detachNewThreadSelector:@selector(autoreleaseThread:)

toTarget: self

withObject: self];

}

Если запустить этот код и одновременно следить за окном консоли, то можно увидеть примерно следующее сообщение:

*** __NSAutoreleaseNoPool: Object 0x5b2c990 of

class NSCFString autoreleased with no pool in place — just leaking

*** __NSAutoreleaseNoPool: Object 0x5b2ca30 of

class NSPathStore2 autoreleased with no pool in place — just leaking

*** __NSAutoreleaseNoPool: Object 0x5b205c0 of

class NSPathStore2 autoreleased with no pool in place — just leaking

*** __NSAutoreleaseNoPool: Object 0x5b2d650 of

class UIImage autoreleased with no pool in place — just leaking

Эти данные свидетельствуют о том, что созданный нами автоматически высвобождаемый экземпляр UIImage приводит к утечке памяти. Более того, утечку вызывают и экземпляр класса NSString под названием FilePath, а также другие объекты, которые в обычной ситуации спокойно высвободились бы. Дело в том, что при создании потока мы забыли первым делом выделить и инициализировать автоматически высвобождаемый пул — именно первым делом. Далее приведен правильный код. Можете сами его протестировать и убедиться, что никаких утечек не возникает:

— (void) autoreleaseThread:(id)paramSender{

@autoreleasepool {

NSBundle *mainBundle = [NSBundle mainBundle];

NSString *filePath = [mainBundle pathForResource:@"AnImage"

ofType:@"png"];

UIImage *image = [UIImage imageWithContentsOfFile: filePath];

/* Делаем что-то с изображением. */

NSLog(@"Image = %@", image);

}

}

— (void)viewDidLoad {

[super viewDidLoad];

[NSThread detachNewThreadSelector:@selector(autoreleaseThread:)

toTarget: self

withObject: self];

}

7.16.

Активизация фоновых методов

Постановка задачи

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

Решение

Воспользуйтесь методом экземпляра performSelectorInBackground: withObject:, относящимся к классу NSObject:

— (BOOL) application:(UIApplication *)application

didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{

[self performSelectorInBackground:@selector(firstCounter)

withObject: nil];

[self performSelectorInBackground:@selector(secondCounter)

withObject: nil];

[self performSelectorInBackground:@selector(thirdCounter)

withObject: nil];

self.window = [[UIWindow alloc] initWithFrame:

[[UIScreen mainScreen] bounds]];

self.window.backgroundColor = [UIColor whiteColor];

[self.window makeKeyAndVisible];

return YES;

}

Методы счетчиков реализуются следующим образом:

— (void) firstCounter{

@autoreleasepool {

NSUInteger counter = 0;

for (counter = 0;

counter < 1000;

counter++){

NSLog(@"First Counter = %lu", (unsigned long)counter);

}

}

}

— (void) secondCounter{

@autoreleasepool {

NSUInteger counter = 0;

for (counter = 0;

counter < 1000;

counter++){

NSLog(@"Second Counter = %lu", (unsigned long)counter);

}

}

}

— (void) thirdCounter{

@autoreleasepool {

NSUInteger counter = 0;

for (counter = 0;

Поделиться:
Популярные книги

Электрические тела

Харрисон Колин
Детективы:
прочие детективы
6.60
рейтинг книги
Электрические тела

Битва

Круз Андрей
2. У Великой реки
Фантастика:
фэнтези
боевая фантастика
8.75
рейтинг книги
Битва

Эпилог

Каверин Вениамин Александрович
Мой 20 век
Документальная литература:
биографии и мемуары
5.00
рейтинг книги
Эпилог

Часовой: воин Ордена

Шторм Максим
2. Часовой
Фантастика:
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Часовой: воин Ордена

Переписка и деловые бумаги

Чехов Антон Павлович
Документальная литература:
публицистика
5.00
рейтинг книги
Переписка и деловые бумаги

День греха

Браун Сандра
Любовные романы:
остросюжетные любовные романы
9.03
рейтинг книги
День греха

Санаторий

Грушко Елена Арсеньевна
Фантастика:
научная фантастика
5.00
рейтинг книги
Санаторий

Иллюзион

Медведев Антон Николаевич
Фантастика:
боевая фантастика
8.18
рейтинг книги
Иллюзион

Зазвездный зов. Стихотворения и поэмы

Ширман Григорий Яковлевич
Серебряный век. Паралипоменон
Поэзия:
поэзия
5.00
рейтинг книги
Зазвездный зов. Стихотворения и поэмы

Молот Пограничья. Гексалогия

Пылаев Валерий
Молот Пограничья
Фантастика:
аниме
фэнтези
фантастика: прочее
попаданцы
5.25
рейтинг книги
Молот Пограничья. Гексалогия

Господин из завтра. Тетралогия.

Махров Алексей
Фантастика:
альтернативная история
8.32
рейтинг книги
Господин из завтра. Тетралогия.

Повелитель снов

Исупова Наталья Леонидовна
Фантастика:
фэнтези
7.00
рейтинг книги
Повелитель снов

Я до сих пор не царь. Книга XXVII

Дрейк Сириус
27. Дорогой барон!
Фантастика:
юмористическое фэнтези
аниме
попаданцы
5.00
рейтинг книги
Я до сих пор не царь. Книга XXVII

Камень Книга седьмая

Минин Станислав
7. Камень
Фантастика:
фэнтези
боевая фантастика
6.40
рейтинг книги
Камень Книга седьмая