Предупреждение о памяти отправляется как уведомление, поэтому оно будет поставлено в очередь на цикле выполнения для отправки, как только появится такая возможность.Если бы вы написали (намеренно прерванный) цикл, например:
while(1)
{
NSString *newString = [NSString string];
}
, то в конечном итоге ваше приложение было бы убито из-за нехватки памяти, но не было бы возможности получить предупреждение о нехватке памяти.
Если вас убивают из-за нехватки памяти без предупреждения, то вы, вероятно, создаете узкое место в памяти для себя где-то, вероятно, у вас есть какой-то цикл, который оставляет много вещей в пуле авто-выпуска- Итак, если вы пройдете весь цикл, то временные объекты исчезают и, следовательно, не имеют долгосрочного следа, но они накапливаются все время, пока вы остаетесь в цикле.
Чтобы избежать такого родаситуации вы хотите посмотреть на вложенность внутренних частей цикла в свои NSAutoreleasePool
s.Например, этот цикл:
while(1)
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSString *newString = [NSString string];
[pool drain]; // stylistically preferred to release, but equivalent
// in reference counted environments
}
Будет продолжаться вечно, но никогда не вызовет состояние нехватки памяти.