2011-12-21 20 views
3

これは奇妙な質問のように聞こえるかもしれませんが、私はIOS 5の面白い問題があります。私たちは大規模なテクスチャをスクロールしています。すべてのデバイス(IOSの4.3GBの古い3GSでも)より高いOSを搭載したデバイスでは、64GBのiPhone 4Sのような最新の&でさえ、重要な吃音を得ることができます。おそらく、マルチタスキングの優先順位を高くし、資源を解放するのではなく、知るのが難しいかもしれないと考えています。メモリを後で解放する目的でメモリを埋める方法は?

メモリをいっぱいにするために(アプリケーション起動時に)何かしたいと思います。メモリ警告をトリガするので、システムはより多くのものを取り除き、私が書き込んだメモリを解放します(私は明らかにしません最終的なアプリでこれを残そうと思っています...)。おそらくこれは、私たちの疑惑がうまく確立されているかどうかを私に示すでしょう。

これまでのところ、私はメモリを埋めるために持っているコードはこれです -

- (void) applicationDidFinishLaunching:(UIApplication*)application { 

    memoryFilled = NO; 

    [self useUpMemory]; 

} 

- (void) useUpMemory { 

    if (memoryFilled) return; 

    NSData *dummyData = [[NSData alloc] initWithBytes:malloc(1024 * 1024) length:1024 * 1024]; 
    [dummyArray addObject:dummyData]; 
    [dummyData release]; 

    printf_console("Filling memory\n"); 

    [self performSelector:@selector(useUpMemory) withObject:nil afterDelay:0.05]; 

} 

- (void) applicationDidReceiveMemoryWarning:(UIApplication*)application { 

    memoryFilled = YES; 
    [dummyArray release]; 

    printf_console("WARNING -> applicationDidReceiveMemoryWarning()\n"); 

} 

しかし、何らかの理由で、メモリがトリガされることはありません&警告をいっぱいにすることはありません。私は後でそれを解放することができるメモリを埋める方法はありますか?

任意の助けに感謝(私はこれを行うべきではない私に教えないでください! - 私が言ったように、それはただのテストです)

+0

'-initWithBytes:length:'はあなたが入れた情報をコピーします。つまり、何もしないmallocで100万バイトを浪費しています。代わりに、 'NSMutableData's''の' initWithLength: 'メソッドを使うことをお勧めします。 –

+0

ログに「Filling memory」と表示される回数は何回ですか? –

+0

まだ停止していない...(下のBenedict Cohenのソリューションを参照) – SomaMan

答えて

4

私はメモリページは、彼らだけ一度に割り当てられているためである疑いがあります書き込まれます。あなたは、割り当てられるメモリページを強制的に何かを書くことができます:

//interface 
@property(nonatomic, retain) NSMutableArray *belly; 

//implementation 
@sythesize belly = _belly; 


-(void)startEatingMemory 
{ 
    self.belly = [NSMutableArray array];  
    [self eatMemory]; 
} 



-(void)stopEatingMemory 
{ 
    //TODO: Add code to log the amount of memory held in self.belly 
    self.belly = [NSMutableArray array]; 
    [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] = '!'; 
    } 
    NSData *plate = [NSData dataWithBytesNoCopy:dinner length:dinnerLength freeWhenDone:YES]; 
    [self.belly addObject:plate]; 

    //repeat after 2 seconds 
    [self performSelector:_cmd withObject:nil afterDelay:2]; 
} 


-(void)didReceiveMemoryWarning 
{ 
    [super didReceiveMemoryWarning]; 

    [self stopEatingMemory]; 
} 
+0

メモリの使用量をリーク経由で増やすことができる場合のみ、ここで正しい警告が表示されていると思いますつまり、useUpMemoryを呼び出すたびに配列に追加した後、greedyBufferを解放しないとします。あなたはこの方法で使われた記憶を何らかの形で作り上げることができますか、それをすべて後で解放するという究極の目的を知っていますか?ありがとう。 – SomaMan

+0

ありがとう!あなたの新しいバージョンはそれをソートしたようです。今、面倒なデバイスに影響を与えるかどうかを調べる。私は途中で "夕食"をより速く満たす方法を知っているとは思いませんか?そうでなければprobsはありません。 – SomaMan

+0

'memcopy()'が速くなります。 –

0

私はdummyArrayuseUpMemorynilであると思われます。これにより、すぐにNSDataがリリースされます。

+0

私は通常の方法で配列をinited ... – SomaMan

関連する問題