Прымяненне IOS, збой пры UIImage загрузкі (віртуальная памяць не ачысткі)

I have a weird crash in my application without any trace. this is probably a memory related problem but with very little information & I'm not sure how to proceed or fix it. If it wasnt for instruments would have been left with no clue what so ever.

I have an image array (in this example an array of size 2) where I load an image, create an image context & draw and save it into the array. Everytime the method is called image array objects are replaced with the new content. In instruments I see a very huge Virtual Memory usage during this method call & apparently after each call memory is not cleared & hence crashes. The project is ARC. I'll list down code below. This is all we need to recreate this issue. (the image I'm using is little big in size about 7MB, so its easier to recreate crash). Also i'm using iPad2 device.

+ (UIImage *)imageCopy:(UIImage *)src
{
    UIGraphicsBeginImageContext(src.size);
    [src drawAtPoint:CGPointZero];
    UIImage *r = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return r;
} 

- (IBAction)buttonTouch:(id)sender
{
    for (int i=0; i<2; i++)
    {
        if (i==0)
        {
            self.mImage = [UIImage imageNamed:@"LARGE_elevation.jpg"];
        }
        else
        {
            self.mImage = [UIImage imageNamed:@"LARGE_elevation2.jpg"];
        }
       //imageArray is a NSMutableArray with capacity of 2
        [imageArray setObject:[ViewController imageCopy:self.mImage] atIndexedSubscript:i];
    }
    ((UIImageView *)[self.view viewWithTag:100]).image = self.mImage;
}

Вось экран з інструментаў, дзе яго падзенне на 2-ы раз пасля папярэджання памяці выпускаюцца.

Instruments Screenshot

Я не бачу вялікай праблемы з метадам «imageCopy» Я выкарыстоўваю тут.

Any help on this is really appreciated. Thanks & Cheers,

1
«У мяне ёсць масіў паказу (у дадзеным прыкладзе масіў памеру 2), дзе я загрузіць малюнак ...» «вобраз я выкарыстоўваю трохі вялікім памерам каля 7 МБ ...» Відаць, гэта не разумны ход ,
дададзена аўтар El Tomato, крыніца
«У мяне ёсць масіў паказу (у дадзеным прыкладзе масіў памеру 2), дзе я загрузіць малюнак ...» «вобраз я выкарыстоўваю трохі вялікім памерам каля 7 МБ ...» Відаць, гэта не разумны ход ,
дададзена аўтар El Tomato, крыніца
«У мяне ёсць масіў паказу (у дадзеным прыкладзе масіў памеру 2), дзе я загрузіць малюнак ...» «вобраз я выкарыстоўваю трохі вялікім памерам каля 7 МБ ...» Відаць, гэта не разумны ход ,
дададзена аўтар El Tomato, крыніца
«У мяне ёсць масіў паказу (у дадзеным прыкладзе масіў памеру 2), дзе я загрузіць малюнак ...» «вобраз я выкарыстоўваю трохі вялікім памерам каля 7 МБ ...» Відаць, гэта не разумны ход ,
дададзена аўтар El Tomato, крыніца

7 адказы

Я даведаўся, што гэта быў <�моцны> цыклічная спасылка пытанне. Таму, калі новы змест замяняе старое ўтрыманне ў масіве, апошнія аб'екты ўсё яшчэ застаюцца. Гэта быў даволі цікавы выснова, таму што ў памяці ўцечкі аналізатара ён з'явіўся ў некалькіх уцечак дадзеных KB, якія вы не падазраюць, як ня вызвалены віртуальнай памяці было некалькі сотняў мегабайт (МБ).

У якасці вельмі абстрактнага прыкладу.

ClassA

@property (strong) ClassB *obj

----------

ClassB

@property (strong) ClassA *obj

- (id)initWithA:(ClassA *)objA;
----------

Такім чынам, пры выдаленні ні адзін з аб'ектаў будзе вызваляцца правільна. У маім выпадку ўцечкі прасочаны з дапамогай аналізатара уцечак было некалькі кілабайт для абодвух аб'ектаў, нават калі разлікі CoreGraphics вешалі на каля 200MB дадзеных у віртуальнай памяці.

Выпраўленне было пазначыць спасылку А ў ClassB як слабы.

ClassB

@property (weak) ClassA *obj

- (id)initWithA:(ClassA *)objA;

Verdict

  • Never under estimate a memory leak, no matter how big or small & arc or mrc
1
дададзена

Я даведаўся, што гэта быў <�моцны> цыклічная спасылка пытанне. Таму, калі новы змест замяняе старое ўтрыманне ў масіве, апошнія аб'екты ўсё яшчэ застаюцца. Гэта быў даволі цікавы выснова, таму што ў памяці ўцечкі аналізатара ён з'явіўся ў некалькіх уцечак дадзеных KB, якія вы не падазраюць, як ня вызвалены віртуальнай памяці было некалькі сотняў мегабайт (МБ).

У якасці вельмі абстрактнага прыкладу.

ClassA

@property (strong) ClassB *obj

----------

ClassB

@property (strong) ClassA *obj

- (id)initWithA:(ClassA *)objA;
----------

Такім чынам, пры выдаленні ні адзін з аб'ектаў будзе вызваляцца правільна. У маім выпадку ўцечкі прасочаны з дапамогай аналізатара уцечак было некалькі кілабайт для абодвух аб'ектаў, нават калі разлікі CoreGraphics вешалі на каля 200MB дадзеных у віртуальнай памяці.

Выпраўленне было пазначыць спасылку А ў ClassB як слабы.

ClassB

@property (weak) ClassA *obj

- (id)initWithA:(ClassA *)objA;

Verdict

  • Never under estimate a memory leak, no matter how big or small & arc or mrc
1
дададзена

Я даведаўся, што гэта быў <�моцны> цыклічная спасылка пытанне. Таму, калі новы змест замяняе старое ўтрыманне ў масіве, апошнія аб'екты ўсё яшчэ застаюцца. Гэта быў даволі цікавы выснова, таму што ў памяці ўцечкі аналізатара ён з'явіўся ў некалькіх уцечак дадзеных KB, якія вы не падазраюць, як ня вызвалены віртуальнай памяці было некалькі сотняў мегабайт (МБ).

У якасці вельмі абстрактнага прыкладу.

ClassA

@property (strong) ClassB *obj

----------

ClassB

@property (strong) ClassA *obj

- (id)initWithA:(ClassA *)objA;
----------

Такім чынам, пры выдаленні ні адзін з аб'ектаў будзе вызваляцца правільна. У маім выпадку ўцечкі прасочаны з дапамогай аналізатара уцечак было некалькі кілабайт для абодвух аб'ектаў, нават калі разлікі CoreGraphics вешалі на каля 200MB дадзеных у віртуальнай памяці.

Выпраўленне было пазначыць спасылку А ў ClassB як слабы.

ClassB

@property (weak) ClassA *obj

- (id)initWithA:(ClassA *)objA;

Verdict

  • Never under estimate a memory leak, no matter how big or small & arc or mrc
1
дададзена

Праблема заключаецца ў тым, верагодна, што метад imageNamed: кэшуецца малюнка загружаныя, і, мабыць, няма спосабу, каб ачысціць кэш памяць пасля папярэджання праграмна
. Замест imageNamed: , вы можаце выкарыстоўваць іншыя метады, такія як initWithData: , ня кэшаваць малюнка. Вы знойдзеце падрабязнае абмеркаванне тут </а>.

0
дададзена
Я думаў, што праблема заключаецца ў тым, што imageNamed: кэшуецца некалькі малюнкаў, і ня не вызваляе памяць аўтаматычна, калі малюнак больш не патрабуецца. Але калі вы атрымаеце той жа вынік з метадамі без кэшавання, давайце паглядзім па іншай прычыне ...
дададзена аўтар Reinhard Männer, крыніца
Дзякуй за ўваход. Але яго ўсё той жа вынік. Акрамя таго, з дакументаў гаворыцца, што «Гэты метад выглядае ў сістэме кэшаў для аб'екта малюнка з паказаным імем і вяртае гэты аб'ект, калі ён існуе. Калі адпаведны аб'ект выявы <�б> не ў кэшы , гэта метад загружае дадзеныя выявы з паказанага файла, кэшуецца яго, а затым вяртае атрыманы аб'ект. »
дададзена аўтар nsuinteger, крыніца

Праблема заключаецца ў тым, верагодна, што метад imageNamed: кэшуецца малюнка загружаныя, і, мабыць, няма спосабу, каб ачысціць кэш памяць пасля папярэджання праграмна
. Замест imageNamed: , вы можаце выкарыстоўваць іншыя метады, такія як initWithData: , ня кэшаваць малюнка. Вы знойдзеце падрабязнае абмеркаванне тут </а>.

0
дададзена
Я думаў, што праблема заключаецца ў тым, што imageNamed: кэшуецца некалькі малюнкаў, і ня не вызваляе памяць аўтаматычна, калі малюнак больш не патрабуецца. Але калі вы атрымаеце той жа вынік з метадамі без кэшавання, давайце паглядзім па іншай прычыне ...
дададзена аўтар Reinhard Männer, крыніца
Дзякуй за ўваход. Але яго ўсё той жа вынік. Акрамя таго, з дакументаў гаворыцца, што «Гэты метад выглядае ў сістэме кэшаў для аб'екта малюнка з паказаным імем і вяртае гэты аб'ект, калі ён існуе. Калі адпаведны аб'ект выявы <�б> не ў кэшы , гэта метад загружае дадзеныя выявы з паказанага файла, кэшуецца яго, а затым вяртае атрыманы аб'ект. »
дададзена аўтар nsuinteger, крыніца

Праблема заключаецца ў тым, верагодна, што метад imageNamed: кэшуецца малюнка загружаныя, і, мабыць, няма спосабу, каб ачысціць кэш памяць пасля папярэджання праграмна
. Замест imageNamed: , вы можаце выкарыстоўваць іншыя метады, такія як initWithData: , ня кэшаваць малюнка. Вы знойдзеце падрабязнае абмеркаванне тут </а>.

0
дададзена
Я думаў, што праблема заключаецца ў тым, што imageNamed: кэшуецца некалькі малюнкаў, і ня не вызваляе памяць аўтаматычна, калі малюнак больш не патрабуецца. Але калі вы атрымаеце той жа вынік з метадамі без кэшавання, давайце паглядзім па іншай прычыне ...
дададзена аўтар Reinhard Männer, крыніца
Дзякуй за ўваход. Але яго ўсё той жа вынік. Акрамя таго, з дакументаў гаворыцца, што «Гэты метад выглядае ў сістэме кэшаў для аб'екта малюнка з паказаным імем і вяртае гэты аб'ект, калі ён існуе. Калі адпаведны аб'ект выявы <�б> не ў кэшы , гэта метад загружае дадзеныя выявы з паказанага файла, кэшуецца яго, а затым вяртае атрыманы аб'ект. »
дададзена аўтар nsuinteger, крыніца

Праблема заключаецца ў тым, верагодна, што метад imageNamed: кэшуецца малюнка загружаныя, і, мабыць, няма спосабу, каб ачысціць кэш памяць пасля папярэджання праграмна
. Замест imageNamed: , вы можаце выкарыстоўваць іншыя метады, такія як initWithData: , ня кэшаваць малюнка. Вы знойдзеце падрабязнае абмеркаванне тут </а>.

0
дададзена
Я думаў, што праблема заключаецца ў тым, што imageNamed: кэшуецца некалькі малюнкаў, і ня не вызваляе памяць аўтаматычна, калі малюнак больш не патрабуецца. Але калі вы атрымаеце той жа вынік з метадамі без кэшавання, давайце паглядзім па іншай прычыне ...
дададзена аўтар Reinhard Männer, крыніца
Дзякуй за ўваход. Але яго ўсё той жа вынік. Акрамя таго, з дакументаў гаворыцца, што «Гэты метад выглядае ў сістэме кэшаў для аб'екта малюнка з паказаным імем і вяртае гэты аб'ект, калі ён існуе. Калі адпаведны аб'ект выявы <�б> не ў кэшы , гэта метад загружае дадзеныя выявы з паказанага файла, кэшуецца яго, а затым вяртае атрыманы аб'ект. »
дададзена аўтар nsuinteger, крыніца