Ios ARC内存分配-无泄漏,但缓慢堆积内存
我已经开始为iOS编写Cordova/Objective-C混合程序的第一次认真尝试,目前在内存分配方面遇到了一些障碍。我需要在web视图中显示用户的相册艺术。我成功地展示了这幅画,但现在分配了大量内存 通过使用“工具”工具并比较几代人的快照,我将罪魁祸首的范围缩小到了这些方法——这些方法都是我从头开始写的。但我很困惑——因为我使用的是自动引用计数,而且我在自动释放池中拥有所有内容,所以不应该有任何内存浪费。有趣的是,我没有看到任何“泄漏”的报告——只是一堆越来越大,分配了越来越多的内存 我附上了一些Instruments工具的屏幕截图: 以下是图像的直接链接,因为文本太多: 下面是我创建的“BukketHelper.M”类的内容(与标题匹配,没有强属性或任何其他类型的定义): 以下是我创建的“MediaQuery.M”类的内容(它与标题完全匹配,没有强属性或其他定义): 所以是的-我的问题是:当涉及到内存分配和泄漏时,我做错了什么?我目前的测试只使用相册艺术,所以“UIImage ImageName”不应该成为问题(因为它的缓存)。此外,我还了解到ARC无法释放CoreGraphics对象,这也可能是问题所在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视图中显示用户的相册艺术。我成功地展示了这幅画,但现在分配了大量内存 通过使用“工具”工具并比较几代人的快照,我将罪魁祸首的范围缩小到了这些方法——这些方法都是我从头开始写的。但我很困惑——因为我使用的是自动引用计数,而且我在自动释放池中拥有所有内容,所以不应该有任何内存浪费。有趣的是,我没有看到任何“泄漏”的报告——只是一堆越来越大,分配了越来越多的内存 我附上
我真的需要一些帮助!谢谢大家! 我遇到了同样的问题。我认为框架中存在一个无法释放内存的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;
}