Присвоить ноль NSString в пуле автоматического выпуска - PullRequest
1 голос
/ 19 декабря 2010

Я делаю много NSString манипуляций в пуле авто-релиза. Проблема в том, что моя программа иногда падает до того, как бассейн истощится. Мне интересно, есть ли способ обойти эту проблему, назначив nil для NSString. Назначение userLetters происходит много. Смотрите код ниже

До

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
   usersLetters = [usersLetters stringByReplacingCharactersInRange:NSMakeRange(indexUser, 1) withString:@"*"];
[pool drain];

* После 1009 *

 NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
   NSString *temp = [usersLetters stringByReplacingCharactersInRange:NSMakeRange(indexUser, 1) withString:@"*"]; //remove that found character so it can't be reused again
   usersLetters = nil;
   usersLetters = temp;
   temp = nil;
[pool drain];

Ответы [ 2 ]

1 голос
/ 19 декабря 2010

Я сомневаюсь, что назначение nil поможет в том, чего вы хотите достичь.(Я предполагаю, что вы имеете в виду, что ваша программа вылетает из-за того, что память исчерпана, в противном случае вы, скорее всего, куда-то выпускали, вам также следует запустить Status Analyzer поверх вашего кода.)сделать это, чтобы отправить сообщение сохранения всем объектам, которые вам все еще нужны (в вашем случае usersLetters) и впоследствии очистить пул.Объекты, в которых вы все еще нуждаетесь, должны иметь счет сохранения 1, все остальные автоматически выпущенные объекты должны быть освобождены.

В вашем случае это будет

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
usersLetters = [[usersLetters stringByReplacingCharactersInRange:NSMakeRange(indexUser, 1) withString:@"*"] retain]; //sending retain to an object increases its retain count by 1 and returns the object itself
// some more stuff that needs memory
[pool drain];
// ...
[usersLetters release];
[pool release];
0 голосов
/ 19 декабря 2010

Вы не упоминаете, нацелен ли ваш проект на iOS или Mac OS X. Если последнее, лучшим способом решения этой проблемы может быть простое использование сборки мусора.

Если GC не является опцией (которой нет в iOS), идиоматический способ справиться с этим - обернуть вложенный пул автоматического выпуска вокруг ваших внутренних, быстро распределяющихся операций. В этом случае вы должны сохранить любые объекты, которые должны пережить вложенный пул, как объяснил mrueg.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...