Andrea Mario Lufino
Andrea Mario Lufino

Reputation: 7921

iOS - Alloc objects until didReceiveMemoryWarning is called

I need to do this : alloc objects until memory warning is called and then release all objects. But I have some problems. How can I do this? I need code example because the problem is that : the code. I have a class that doesn't use ARC. This class has a method which alloc N objects that are saved into an array. I need the memory is filled until didReceiveMemoryWarning is called because this is the only method to "free" RAM memory on iOS. Then, I will release all. I think the cleaner memory apps for the iPhone on the App Store use this trick to "free" the memory. Thanks in advance

Upvotes: 0

Views: 322

Answers (2)

utahwithak
utahwithak

Reputation: 6335

You'll have to fill in the missing details but here is what I have used before. Credit goes to who/where ever I found it. This will work on ARC and non ARC projects. I have found that usually you get 2-3 warnings before you're completely dead. Good luck. Dinner length is how much of a chunk that gets allocated each time. if you want more fine grained memory control change the size.

-(IBAction)startEatingMemory:(id)sender
{
    if(self.belly == nil){
        self.belly = [NSMutableArray array];
    }
    self.paused = false;
    [self eatMemory];
} 

- (IBAction)pauseEat:(id)sender {
    self.paused = true;
    [[self class]cancelPreviousPerformRequestsWithTarget:self selector:@selector(eatMemory) object:nil];
}

- (IBAction)stopEatingMemory:(id)sender {
    [self pauseEat:self];

    [self.belly removeAllObjects];
    [[self class] cancelPreviousPerformRequestsWithTarget:self selector:@selector(eatMemory) object:nil];

 }


-(void)eatMemory
{
    unsigned long dinnerLength = 1024 * 1024;
    char *dinner = malloc(sizeof(char) * dinnerLength);
    for (int i=0; i < dinnerLength; i++)
    {
        //write to each byte ensure that the memory pages are actually allocated
        dinner[i] = '0';
    }
    NSData *plate = [NSData dataWithBytesNoCopy:dinner length:dinnerLength freeWhenDone:YES];
    [self.belly addObject:plate];


    [self performSelector:@selector(eatMemory) withObject:nil afterDelay:.1];
}



-(void)didReceiveMemoryWarning 
{

    [self pauseEat:self];
    <#Could release all here#>
    [super didReceiveMemoryWarning];
}

Upvotes: 2

coneybeare
coneybeare

Reputation: 33101

I would edit/subclass the class that doesn't use ARC to either use ARC, or add a method to it that releases the N objects.

Upvotes: 0

Related Questions