Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/119.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios ARC内存分配-无泄漏,但缓慢堆积内存_Ios_Objective C_Xcode_Memory Management_Automatic Ref Counting - Fatal编程技术网

Ios ARC内存分配-无泄漏,但缓慢堆积内存

Ios ARC内存分配-无泄漏,但缓慢堆积内存,ios,objective-c,xcode,memory-management,automatic-ref-counting,Ios,Objective C,Xcode,Memory Management,Automatic Ref Counting,我已经开始为iOS编写Cordova/Objective-C混合程序的第一次认真尝试,目前在内存分配方面遇到了一些障碍。我需要在web视图中显示用户的相册艺术。我成功地展示了这幅画,但现在分配了大量内存 通过使用“工具”工具并比较几代人的快照,我将罪魁祸首的范围缩小到了这些方法——这些方法都是我从头开始写的。但我很困惑——因为我使用的是自动引用计数,而且我在自动释放池中拥有所有内容,所以不应该有任何内存浪费。有趣的是,我没有看到任何“泄漏”的报告——只是一堆越来越大,分配了越来越多的内存 我附上

我已经开始为iOS编写Cordova/Objective-C混合程序的第一次认真尝试,目前在内存分配方面遇到了一些障碍。我需要在web视图中显示用户的相册艺术。我成功地展示了这幅画,但现在分配了大量内存

通过使用“工具”工具并比较几代人的快照,我将罪魁祸首的范围缩小到了这些方法——这些方法都是我从头开始写的。但我很困惑——因为我使用的是自动引用计数,而且我在自动释放池中拥有所有内容,所以不应该有任何内存浪费。有趣的是,我没有看到任何“泄漏”的报告——只是一堆越来越大,分配了越来越多的内存

我附上了一些Instruments工具的屏幕截图:

以下是图像的直接链接,因为文本太多:

下面是我创建的“BukketHelper.M”类的内容(与标题匹配,没有强属性或任何其他类型的定义):

以下是我创建的“MediaQuery.M”类的内容(它与标题完全匹配,没有强属性或其他定义):

所以是的-我的问题是:当涉及到内存分配和泄漏时,我做错了什么?我目前的测试只使用相册艺术,所以“UIImage ImageName”不应该成为问题(因为它的缓存)。此外,我还了解到ARC无法释放CoreGraphics对象,这也可能是问题所在


我真的需要一些帮助!谢谢大家!

我遇到了同样的问题。我认为框架中存在一个无法释放内存的bug。基本上,每次调用
func-imageWithSize(size:CGSize)->UIImage?
时,分配的内存都会出现一个巨大的峰值


如果有帮助的话,我注意到如果调用这个函数传入artwork.bounds.size(而不是每次创建一个新的图像大小),那么内存只分配一次,再次调用imageWithSize(具有相同的尺寸)不会重新分配新内存。只有当您传入原始艺术品图像的大小,并且没有返回自定义大小时,才会出现这种情况。如果您需要自定义大小,那么您可以自己调整UIImage的大小,而不必依赖此错误方法。

您有足够的rep直接在帖子中包含图像-您没有使用该功能的原因是什么?可能不知道该功能;)我在中编辑了它们-您可以查看我的编辑以了解该功能:)实际上,您可能也想显示该链接,因为它有点难以阅读,因为其中包含大量文本-您的决定。完成,完成!谢谢你的帮助!
-(NSString *)   convertULLToNSString:(NSNumber* )guid
{
    return [NSString stringWithFormat:@"%llu", [guid unsignedLongLongValue]];
}

-(NSNumber *)   convertStringToULL:(NSString *) guid
{
    //get string to number
    //this causes memory to not be released
    unsigned long long ullvalue = strtoull([guid UTF8String], NULL, 10);
    NSNumber *numberID = [[NSNumber alloc] initWithUnsignedLongLong:ullvalue];

    return numberID;
}
-(MPMediaItem*) getMediaItemULL:(NSNumber*)guid
{
    @autoreleasepool {
         //run the query on
        MPMediaQuery *query = [[MPMediaQuery alloc] init];
        [query addFilterPredicate:[MPMediaPropertyPredicate predicateWithValue:guid forProperty:MPMediaItemPropertyPersistentID]];

        //get and return the item
        NSArray *mediaResults = [query items];
        return [mediaResults firstObject];
    }
}

-(MPMediaItem*) getMediaItem:(NSString*)guid
{
    @autoreleasepool {
        BukketHelper* bh = [[BukketHelper alloc] init];
        return [self getMediaItemULL:[bh convertStringToULL:guid]];
    }
}

-(UIImage*) getMediaAlbumArtAsUIImage:(NSString*)guid withQuality:(NSNumber*)quality withLength:(NSNumber*)length subsituteImageName:(NSString* )filename
{
    return [self getMediaAlbumArtFromMediaItemAsUIImage:[self getMediaItem:guid] withQuality:quality withLength:length subsituteImageName:filename];
}

-(NSString*) getMediaAlbumArtAsBase64:(NSString*)guid withQuality:(NSNumber*)quality withLength:(NSNumber*)length subsituteImageName:(NSString* )filename
{
    NSString *base64 = nil;

    @autoreleasepool {
        UIImage* rawImage = [self getMediaAlbumArtAsUIImage:guid withQuality:quality withLength:length subsituteImageName:filename];
        NSData *imageData = nil;

        if (rawImage != nil)
        {
            @autoreleasepool {
                //this causes memory to not be released
                imageData = UIImageJPEGRepresentation(rawImage, [quality floatValue]);
                base64 = [imageData base64EncodedStringWithOptions:0];
            }
        }
    }

    return base64;
}

-(UIImage*)  getMediaAlbumArtFromMediaItemAsUIImage:(MPMediaItem*)item withQuality:(NSNumber*)quality withLength:(NSNumber*)length subsituteImageName:(NSString* )filename
{
    UIImage *rawImage = nil;

    @autoreleasepool {
        bool successfulArt = NO;

        if (item != nil)
        {
            MPMediaItemArtwork *albumArt = [item valueForProperty:MPMediaItemPropertyArtwork];

            if (albumArt != nil) {
                 @autoreleasepool {
                    //this causes memory to not be released
                    rawImage = [albumArt imageWithSize:CGSizeMake([length doubleValue], [length doubleValue])];
                    successfulArt = YES;
                }
            }
        }

        if (successfulArt == NO)
        {
            rawImage = [UIImage imageNamed:filename];
        }
    }

    return rawImage;
}