2013-09-05 53 views
0

我需要這樣做:alloc對象,直到調用內存警告,然後釋放所有對象。但我有一些問題。我怎樣才能做到這一點?我需要代碼示例,因爲問題在於:代碼。我有一個不使用ARC的類。這個類有一個方法來分配N個保存到數組中的對象。我需要填充內存直到didReceiveMemoryWarning被調用,因爲這是在iOS上「釋放」RAM內存的唯一方法。然後,我會釋放所有。我認爲App Store上的iPhone清潔內存應用程序使用這個技巧來「釋放」內存。 在此先感謝iOS - 直到調用didReceiveMemoryWarning爲止的Alloc對象

回答

2

你必須填寫缺少的細節,但這是我以前使用過的。信譽歸功於誰/我曾經發現它。這將適用於ARC和非ARC項目。我發現在你完全死亡之前,你通常會得到2-3次警告。祝你好運。晚餐長度是每次分配多少塊。如果你想更細粒度的內存控制改變大小。

-(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]; 
} 
+0

這個答案完全解決了我的問題!完善!謝謝! –

0

我會編輯/子類不使用ARC要麼使用ARC,要麼添加一個方法,它釋放N個對象。