diff --git a/FastImageCache/FICImageCache.h b/FastImageCache/FICImageCache.h index b6f850a..ff766b3 100644 --- a/FastImageCache/FICImageCache.h +++ b/FastImageCache/FICImageCache.h @@ -34,7 +34,7 @@ typedef void (^FICImageRequestCompletionBlock)(UIImage *sourceImage); @discussion The delegate is responsible for asynchronously providing the source image for an entity. Optionally, the delegate can require that all formats in a format family for a particular entity be processed. Any errors that occur in the image cache are also communicated back to the delegate. */ -@property (nonatomic, weak) id delegate; +@property(nonatomic, assign) id delegate; ///--------------------------------------- /// @name Accessing the Shared Image Cache diff --git a/FastImageCache/FICImageCache.m b/FastImageCache/FICImageCache.m index 47322db..3c41eee 100644 --- a/FastImageCache/FICImageCache.m +++ b/FastImageCache/FICImageCache.m @@ -25,7 +25,7 @@ @interface FICImageCache () { NSMutableDictionary *_formats; NSMutableDictionary *_imageTables; NSMutableDictionary *_requests; - __weak id _delegate; + id _delegate; BOOL _delegateImplementsShouldProcessAllFormatsInFamilyForEntity; BOOL _delegateImplementsErrorDidOccurWithMessage; @@ -87,6 +87,14 @@ - (id)init { return self; } +- (void)dealloc { + [_formats release]; + [_imageTables release]; + [_requests release]; + + [super dealloc]; +} + #pragma mark - Working with Formats - (void)setFormats:(NSArray *)formats { @@ -102,6 +110,7 @@ - (void)setFormats:(NSArray *)formats { // Only initialize an image table for this format if it is needed on the current device. FICImageTable *imageTable = [[FICImageTable alloc] initWithFormat:imageFormat]; [_imageTables setObject:imageTable forKey:formatName]; + [imageTable release]; [_formats setObject:imageFormat forKey:formatName]; [imageTableFiles addObject:[[imageTable tableFilePath] lastPathComponent]]; @@ -139,7 +148,7 @@ - (NSArray *)formatsWithFamily:(NSString *)family { } } - return [formats copy]; + return [[formats copy] autorelease]; } #pragma mark - Retrieving Images @@ -170,6 +179,8 @@ - (BOOL)_retrieveImageForEntity:(id )entity withFormatName:(NSString completionBlock(entity, formatName, image); }); } + + [image release]; // Already retained by the block }); } else { UIImage *image = [imageTable newImageForEntityUUID:entityUUID sourceImageUUID:sourceImageUUID preheatData:NO]; @@ -185,6 +196,8 @@ - (BOOL)_retrieveImageForEntity:(id )entity withFormatName:(NSString }); } } + + [image release]; // Already retained by the block }; if (image == nil && _delegate != nil) { @@ -262,7 +275,7 @@ static void _FICAddCompletionBlockForEntity(NSString *formatName, NSMutableDicti [completionBlocks setObject:blocksArray forKey:formatName]; } - FICImageCacheCompletionBlock completionBlockCopy = [completionBlock copy]; + FICImageCacheCompletionBlock completionBlockCopy = [[completionBlock copy] autorelease]; [blocksArray addObject:completionBlockCopy]; } } @@ -274,7 +287,7 @@ - (void)setImage:(UIImage *)image forEntity:(id )entity withFormatNam NSDictionary *completionBlocksDictionary = nil; if (completionBlock != nil) { - completionBlocksDictionary = [NSDictionary dictionaryWithObject:[NSArray arrayWithObject:[completionBlock copy]] forKey:formatName]; + completionBlocksDictionary = [NSDictionary dictionaryWithObject:[NSArray arrayWithObject:[[completionBlock copy] autorelease]] forKey:formatName]; } NSString *entityUUID = [entity UUID]; @@ -348,6 +361,8 @@ - (void)_processImage:(UIImage *)image forEntity:(id )entity imageTab } }); } + + [resultImage release]; }); } } diff --git a/FastImageCache/FICImageFormat.m b/FastImageCache/FICImageFormat.m index d33b41b..1566878 100644 --- a/FastImageCache/FICImageFormat.m +++ b/FastImageCache/FICImageFormat.m @@ -127,7 +127,7 @@ - (BOOL)isGrayscale { #pragma mark - Object Lifecycle + (instancetype)formatWithName:(NSString *)name family:(NSString *)family imageSize:(CGSize)imageSize style:(FICImageFormatStyle)style maximumCount:(NSInteger)maximumCount devices:(FICImageFormatDevices)devices { - FICImageFormat *imageFormat = [[FICImageFormat alloc] init]; + FICImageFormat *imageFormat = [[[FICImageFormat alloc] init] autorelease]; [imageFormat setName:name]; [imageFormat setFamily:family]; @@ -139,6 +139,13 @@ + (instancetype)formatWithName:(NSString *)name family:(NSString *)family imageS return imageFormat; } +- (void)dealloc { + [_name release]; + [_family release]; + + [super dealloc]; +} + #pragma mark - Working with Dictionary Representations - (NSDictionary *)dictionaryRepresentation { diff --git a/FastImageCache/FICImageTable.h b/FastImageCache/FICImageTable.h index 5959b1b..ac516a8 100644 --- a/FastImageCache/FICImageTable.h +++ b/FastImageCache/FICImageTable.h @@ -42,7 +42,7 @@ extern NSString *const FICImageTableScreenScaleKey; /** The image format that describes the image table. */ -@property (nonatomic, strong, readonly) FICImageFormat *imageFormat; +@property (nonatomic, retain, readonly) FICImageFormat *imageFormat; ///----------------------------------------------- /// @name Accessing Information about Image Tables diff --git a/FastImageCache/FICImageTable.m b/FastImageCache/FICImageTable.m index 718d479..0730ffe 100644 --- a/FastImageCache/FICImageTable.m +++ b/FastImageCache/FICImageTable.m @@ -25,9 +25,10 @@ static NSString *const FICImageTableMetadataFileExtension = @"metadata"; static NSString *const FICImageTableFileExtension = @"imageTable"; -static NSString *const FICImageTableIndexMapKey = @"indexMap"; -static NSString *const FICImageTableContextMapKey = @"contextMap"; -static NSString *const FICImageTableMRUArrayKey = @"mruArray"; +static NSString *const FICImageTableMetadataKey = @"metadata"; +static NSString *const FICImageTableMRUIndexKey = @"mruIndex"; +static NSString *const FICImageTableContextUUIDKey = @"contextUUID"; +static NSString *const FICImageTableIndexKey = @"tableIndex"; static NSString *const FICImageTableFormatKey = @"format"; #pragma mark - Class Extension @@ -51,7 +52,7 @@ @interface FICImageTable () { NSMutableDictionary *_chunkDictionary; NSCountedSet *_chunkSet; - + NSRecursiveLock *_lock; CFMutableDictionaryRef _indexNumbers; @@ -107,9 +108,9 @@ + (NSString *)directoryPath { static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES); - __directoryPath = [[paths objectAtIndex:0] stringByAppendingPathComponent:@"ImageTables"]; + __directoryPath = [[[paths objectAtIndex:0] stringByAppendingPathComponent:@"ImageTables"] retain]; - NSFileManager *fileManager = [[NSFileManager alloc] init]; + NSFileManager *fileManager = [[[NSFileManager alloc] init] autorelease]; BOOL directoryExists = [fileManager fileExistsAtPath:__directoryPath]; if (directoryExists == NO) { [fileManager createDirectoryAtPath:__directoryPath withIntermediateDirectories:YES attributes:nil error:nil]; @@ -133,7 +134,7 @@ - (instancetype)initWithFormat:(FICImageFormat *)imageFormat { _indexNumbers = CFDictionaryCreateMutable(kCFAllocatorDefault, 0, NULL, &kCFTypeDictionaryValueCallBacks); _imageFormat = [imageFormat copy]; - _imageFormatDictionary = [imageFormat dictionaryRepresentation]; + _imageFormatDictionary = [[imageFormat dictionaryRepresentation] retain]; _screenScale = [[UIScreen mainScreen] scale]; @@ -144,12 +145,12 @@ - (instancetype)initWithFormat:(FICImageFormat *)imageFormat { _chunkDictionary = [[NSMutableDictionary alloc] init]; _chunkSet = [[NSCountedSet alloc] init]; - + _indexMap = [[NSMutableDictionary alloc] init]; _occupiedIndexes = [[NSMutableIndexSet alloc] init]; _MRUEntries = [[NSMutableOrderedSet alloc] init]; - _inUseEntries = [NSCountedSet set]; + _inUseEntries = [[NSCountedSet alloc] init]; _sourceImageMap = [[NSMutableDictionary alloc] init]; @@ -187,7 +188,8 @@ - (instancetype)initWithFormat:(FICImageFormat *)imageFormat { // If something goes wrong and we can't open the image table file, then we have no choice but to release and nil self. NSString *message = [NSString stringWithFormat:@"*** FIC Error: %s could not open the image table file at path %@. The image table was not created.", __PRETTY_FUNCTION__, _filePath]; [[FICImageCache sharedImageCache] _logMessage:message]; - + + [self release]; self = nil; } } @@ -200,9 +202,24 @@ - (instancetype)init { } - (void)dealloc { + [_imageFormat release]; + [_filePath release]; + + [_indexMap release]; + [_occupiedIndexes release]; + [_MRUEntries release]; + [_sourceImageMap release]; + [_imageFormatDictionary release]; + [_chunkDictionary release]; + [_chunkSet release]; + if (_fileDescriptor >= 0) { close(_fileDescriptor); } + + [_lock release]; + + [super dealloc]; } #pragma mark - Working with Chunks @@ -224,7 +241,7 @@ - (FICImageTableChunk *)_chunkAtIndex:(NSInteger)index { FICImageTableChunk *chunk = nil; if (index < _chunkCount) { - chunk = [self _cachedChunkAtIndex:index]; + chunk = [[self _cachedChunkAtIndex:index] retain]; if (chunk == nil) { size_t chunkLength = _chunkLength; @@ -233,7 +250,7 @@ - (FICImageTableChunk *)_chunkAtIndex:(NSInteger)index { chunkLength = (size_t)(_fileLength - chunkOffset); } - chunk = [[FICImageTableChunk alloc] initWithFileDescriptor:_fileDescriptor index:index length:chunkLength]; + chunk = [[FICImageTableChunk alloc] initWithImageTable:self fileDescriptor:_fileDescriptor index:index length:chunkLength]; [self _setChunk:chunk index:index]; } } @@ -243,7 +260,15 @@ - (FICImageTableChunk *)_chunkAtIndex:(NSInteger)index { [[FICImageCache sharedImageCache] _logMessage:message]; } - return chunk; + return [chunk autorelease]; +} + +- (void)_chunkWillBeDeallocated:(FICImageTableChunk *)chunk { + [_lock lock]; + + [self _setChunk:nil index:[chunk index]]; + + [_lock unlock]; } #pragma mark - Storing, Retrieving, and Deleting Entries @@ -290,8 +315,6 @@ - (void)setEntryForEntityUUID:(NSString *)entityUUID sourceImageUUID:(NSString * [_lock unlock]; CGContextRef context = CGBitmapContextCreate([entryData bytes], pixelSize.width, pixelSize.height, bitsPerComponent, _imageRowLength, colorSpace, bitmapInfo); - CGColorSpaceRelease(colorSpace); - CGContextTranslateCTM(context, 0, pixelSize.height); CGContextScaleCTM(context, _screenScale, -_screenScale); @@ -306,6 +329,7 @@ - (void)setEntryForEntityUUID:(NSString *)entityUUID sourceImageUUID:(NSString * } else { [_lock unlock]; } + CGColorSpaceRelease(colorSpace); } else { [_lock unlock]; } @@ -333,13 +357,15 @@ - (UIImage *)newImageForEntityUUID:(NSString *)entityUUID sourceImageUUID:(NSStr } else { [self _entryWasAccessedWithEntityUUID:entityUUID]; + [entryData retain]; // Released by _FICReleaseImageData + // Create CGImageRef whose backing store *is* the mapped image table entry. We avoid a memcpy this way. - CGDataProviderRef dataProvider = CGDataProviderCreateWithData((__bridge_retained void *)entryData, [entryData bytes], [entryData imageLength], _FICReleaseImageData); + CGDataProviderRef dataProvider = CGDataProviderCreateWithData((void *)entryData, [entryData bytes], [entryData imageLength], _FICReleaseImageData); [_inUseEntries addObject:entityUUID]; - __weak FICImageTable *weakSelf = self; + [entryData executeBlockOnDealloc:^{ - [weakSelf removeInUseForEntityUUID:entityUUID]; + [self removeInUseForEntityUUID:entityUUID]; }]; CGSize pixelSize = [_imageFormat pixelSize]; @@ -441,7 +467,7 @@ - (int)_maximumCount { } - (void)_setEntryCount:(NSInteger)entryCount { - if (entryCount != _entryCount) { + if (entryCount != _entryCount && _entriesPerChunk > 0) { off_t fileLength = entryCount * _entryLength; int result = ftruncate(_fileDescriptor, fileLength); @@ -451,7 +477,7 @@ - (void)_setEntryCount:(NSInteger)entryCount { } else { _fileLength = fileLength; _entryCount = entryCount; - _chunkCount = _entriesPerChunk > 0 ? ((_entryCount + _entriesPerChunk - 1) / _entriesPerChunk) : 0; + _chunkCount = (_entryCount + _entriesPerChunk - 1) / _entriesPerChunk; } } } @@ -476,9 +502,8 @@ - (FICImageTableEntry *)_entryDataAtIndex:(NSInteger)index { [_chunkSet addObject:chunk]; - __weak FICImageTable *weakSelf = self; [entryData executeBlockOnDealloc:^{ - [weakSelf _entryWasDeallocatedFromChunk:chunk]; + [self _entryWasDeallocatedFromChunk:chunk]; }]; } } @@ -490,7 +515,7 @@ - (FICImageTableEntry *)_entryDataAtIndex:(NSInteger)index { [[FICImageCache sharedImageCache] _logMessage:message]; } - return entryData; + return [entryData autorelease]; } - (void)_entryWasDeallocatedFromChunk:(FICImageTableChunk *)chunk { @@ -510,6 +535,7 @@ - (NSInteger)_nextEntryIndex { if (index == NSNotFound) { index = _entryCount; } + [unoccupiedIndexes release]; if (index >= [self _maximumCount] && [_MRUEntries count]) { // Evict the oldest/least-recently accessed entry here @@ -575,8 +601,10 @@ - (void)_entryWasAccessedWithEntityUUID:(NSString *)entityUUID { if (index == NSNotFound) { [_MRUEntries insertObject:entityUUID atIndex:0]; } else if (index != 0) { + [entityUUID retain]; [_MRUEntries removeObjectAtIndex:index]; [_MRUEntries insertObject:entityUUID atIndex:0]; + [entityUUID release]; } } @@ -595,11 +623,29 @@ - (NSNumber *)_numberForEntryAtIndex:(NSInteger)index { - (void)saveMetadata { [_lock lock]; + NSMutableDictionary *entryMetadata = [NSMutableDictionary dictionary]; + for (NSString *entityUUID in [_indexMap allKeys]) { + NSMutableDictionary *entryDict = [entryMetadata objectForKey:entityUUID]; + if (!entryDict) { + entryDict = [[NSMutableDictionary alloc] init]; + [entryMetadata setObject:entryDict forKey:entityUUID]; + [entryDict release]; + } + NSNumber *tableIndexVal = [_indexMap objectForKey:entityUUID]; + NSString *contextUUID = [_sourceImageMap objectForKey:entityUUID]; + NSInteger mruIndex = [_MRUEntries indexOfObject:entityUUID]; + + [entryDict setValue:tableIndexVal forKey:FICImageTableIndexKey]; + [entryDict setValue:contextUUID forKey:FICImageTableContextUUIDKey]; + if (mruIndex != NSNotFound) { + [entryDict setValue:[NSNumber numberWithInteger:mruIndex] forKey:FICImageTableMRUIndexKey]; + } + } + NSDictionary *metadataDictionary = [NSDictionary dictionaryWithObjectsAndKeys: - [_indexMap copy], FICImageTableIndexMapKey, - [_sourceImageMap copy], FICImageTableContextMapKey, - [[_MRUEntries array] copy], FICImageTableMRUArrayKey, - [_imageFormatDictionary copy], FICImageTableFormatKey, nil]; + entryMetadata, FICImageTableMetadataKey, + [[_imageFormatDictionary copy] autorelease], FICImageTableFormatKey, nil]; + [_lock unlock]; static dispatch_queue_t __metadataQueue = nil; @@ -635,19 +681,39 @@ - (void)_loadMetadata { [[FICImageCache sharedImageCache] _logMessage:message]; } - [_indexMap setDictionary:[metadataDictionary objectForKey:FICImageTableIndexMapKey]]; - - for (NSNumber *index in [_indexMap allValues]) { - [_occupiedIndexes addIndex:[index intValue]]; + NSDictionary *tableMetadata = [metadataDictionary objectForKey:FICImageTableMetadataKey]; + NSInteger count = [tableMetadata count]; + NSMutableArray *mruArray = [NSMutableArray arrayWithCapacity:count]; + for (NSInteger i = 0; i < count; i++) { + [mruArray addObject:[NSNull null]]; } + NSMutableIndexSet *nullIndexes = [NSMutableIndexSet indexSetWithIndexesInRange:NSMakeRange(0, count)]; - [_sourceImageMap setDictionary:[metadataDictionary objectForKey:FICImageTableContextMapKey]]; - + [_indexMap removeAllObjects]; + [_sourceImageMap removeAllObjects]; [_MRUEntries removeAllObjects]; - NSArray *mruArray = [metadataDictionary objectForKey:FICImageTableMRUArrayKey]; - if (mruArray) { - [_MRUEntries addObjectsFromArray:mruArray]; + for (NSString *entityUUID in [tableMetadata allKeys]) { + NSDictionary *entryDict = [tableMetadata objectForKey:entityUUID]; + [_indexMap setValue:[entryDict objectForKey:FICImageTableIndexKey] forKey:entityUUID]; + [_sourceImageMap setValue:[entryDict objectForKey:FICImageTableContextUUIDKey] forKey:entityUUID]; + NSNumber *mruIndexVal = [entryDict objectForKey:FICImageTableMRUIndexKey]; + if (mruIndexVal) { + NSInteger mruIndex = [mruIndexVal integerValue]; + [mruArray replaceObjectAtIndex:mruIndex withObject:entityUUID]; + [nullIndexes removeIndex:mruIndex]; + } + } + + NSUInteger index = [nullIndexes lastIndex]; + while (index != NSNotFound) { + [mruArray removeObjectAtIndex:index]; + index = [nullIndexes indexLessThanIndex:index]; + } + [_MRUEntries addObjectsFromArray:mruArray]; + + for (NSNumber *index in [_indexMap allValues]) { + [_occupiedIndexes addIndex:[index intValue]]; } } } diff --git a/FastImageCache/FICImageTableChunk.h b/FastImageCache/FICImageTableChunk.h index 4990fc9..b93f6c1 100644 --- a/FastImageCache/FICImageTableChunk.h +++ b/FastImageCache/FICImageTableChunk.h @@ -42,6 +42,8 @@ /** Initializes a new image table chunk. + + @param imageTable The image table to create a chunk from. @param fileDescriptor The image table's file descriptor to map from. @@ -51,6 +53,6 @@ @return A new image table chunk. */ -- (instancetype)initWithFileDescriptor:(int)fileDescriptor index:(NSInteger)index length:(size_t)length; +- (instancetype)initWithImageTable:(FICImageTable *)imageTable fileDescriptor:(int)fileDescriptor index:(NSInteger)index length:(size_t)length; @end \ No newline at end of file diff --git a/FastImageCache/FICImageTableChunk.m b/FastImageCache/FICImageTableChunk.m index c893eb9..5588a37 100644 --- a/FastImageCache/FICImageTableChunk.m +++ b/FastImageCache/FICImageTableChunk.m @@ -7,12 +7,22 @@ // #import "FICImageTableChunk.h" +#import "FICImageTable.h" #import +#pragma mark FICImageTable (FICImageTableChunkAdditions) + +@interface FICImageTable (FICImageTableChunkAdditions) + +- (void)_chunkWillBeDeallocated:(FICImageTableChunk *)chunk; + +@end + #pragma mark - Class Extension @interface FICImageTableChunk () { + FICImageTable *_owningImageTable; NSInteger _index; void *_bytes; size_t _length; @@ -30,10 +40,11 @@ @implementation FICImageTableChunk #pragma mark - Object Lifecycle -- (instancetype)initWithFileDescriptor:(int)fileDescriptor index:(NSInteger)index length:(size_t)length { +- (id)initWithImageTable:(FICImageTable *)imageTable fileDescriptor:(int)fileDescriptor index:(NSInteger)index length:(size_t)length { self = [super init]; if (self != nil) { + _owningImageTable = [imageTable retain]; _index = index; _length = length; _fileOffset = _index * _length; @@ -50,9 +61,23 @@ - (instancetype)initWithFileDescriptor:(int)fileDescriptor index:(NSInteger)inde } - (void)dealloc { + [_owningImageTable release]; + if (_bytes != NULL) { munmap(_bytes, _length); } + + [super dealloc]; +} + +- (oneway void)release { + // While it is good practice to never access retainCount, in this case, it is necessary. This is the only way + // to know that self will soon be deallocated prior to the start of execution of the dealloc method. + if ([self retainCount] == 1) { + [_owningImageTable _chunkWillBeDeallocated:self]; + } + + [super release]; } @end diff --git a/FastImageCache/FICImageTableEntry.m b/FastImageCache/FICImageTableEntry.m index 68697ce..9d55717 100644 --- a/FastImageCache/FICImageTableEntry.m +++ b/FastImageCache/FICImageTableEntry.m @@ -64,7 +64,7 @@ - (id)initWithImageTableChunk:(FICImageTableChunk *)imageTableChunk bytes:(void self = [super init]; if (self != nil) { - _imageTableChunk = imageTableChunk; + _imageTableChunk = [imageTableChunk retain]; _bytes = bytes; _length = length; _deallocBlocks = [[NSMutableArray alloc] init]; @@ -74,13 +74,21 @@ - (id)initWithImageTableChunk:(FICImageTableChunk *)imageTableChunk bytes:(void } - (void)executeBlockOnDealloc:(dispatch_block_t)block { - [_deallocBlocks addObject:[block copy]]; + if (block) { + id blockCopy = [block copy]; + [_deallocBlocks addObject:blockCopy]; + [blockCopy release]; + } } - (void)dealloc { for (dispatch_block_t block in _deallocBlocks) { dispatch_async([FICImageCache dispatchQueue], block); } + + [_imageTableChunk release]; + [_deallocBlocks release]; + [super dealloc]; } #pragma mark - Other Accessors diff --git a/FastImageCache/FICUtilities.m b/FastImageCache/FICUtilities.m index cf0da62..79d1a36 100644 --- a/FastImageCache/FICUtilities.m +++ b/FastImageCache/FICUtilities.m @@ -33,11 +33,11 @@ inline size_t FICByteAlignForCoreAnimation(size_t bytesPerRow) { CFUUIDRef UUIDRef = CFUUIDCreateFromUUIDBytes(kCFAllocatorDefault, UUIDBytes); if (UUIDRef != NULL) { - UUIDString = (__bridge_transfer NSString *)CFUUIDCreateString(kCFAllocatorDefault, UUIDRef); + UUIDString = (NSString *)CFUUIDCreateString(kCFAllocatorDefault, UUIDRef); CFRelease(UUIDRef); } - return UUIDString; + return [UUIDString autorelease]; } CFUUIDBytes FICUUIDBytesWithString(NSString *string) { diff --git a/FastImageCacheDemo/FastImageCacheDemo.xcodeproj/project.pbxproj b/FastImageCacheDemo/FastImageCacheDemo.xcodeproj/project.pbxproj index 8decd75..f034f77 100644 --- a/FastImageCacheDemo/FastImageCacheDemo.xcodeproj/project.pbxproj +++ b/FastImageCacheDemo/FastImageCacheDemo.xcodeproj/project.pbxproj @@ -9,11 +9,11 @@ /* Begin PBXBuildFile section */ 2E095B1417AEBB1200ECE160 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2E095B1317AEBB1200ECE160 /* UIKit.framework */; }; 2E095B1617AEBB1200ECE160 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2E095B1517AEBB1200ECE160 /* Foundation.framework */; }; - 2E1BC8F017C57C4700836A7E /* FICImageCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 2E1BC8E417C57C4700836A7E /* FICImageCache.m */; }; - 2E1BC8F117C57C4700836A7E /* FICImageFormat.m in Sources */ = {isa = PBXBuildFile; fileRef = 2E1BC8E617C57C4700836A7E /* FICImageFormat.m */; }; - 2E1BC8F217C57C4700836A7E /* FICImageTable.m in Sources */ = {isa = PBXBuildFile; fileRef = 2E1BC8E817C57C4700836A7E /* FICImageTable.m */; }; - 2E1BC8F317C57C4700836A7E /* FICImageTableChunk.m in Sources */ = {isa = PBXBuildFile; fileRef = 2E1BC8EA17C57C4700836A7E /* FICImageTableChunk.m */; }; - 2E1BC8F417C57C4700836A7E /* FICImageTableEntry.m in Sources */ = {isa = PBXBuildFile; fileRef = 2E1BC8EC17C57C4700836A7E /* FICImageTableEntry.m */; }; + 2E1BC8F017C57C4700836A7E /* FICImageCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 2E1BC8E417C57C4700836A7E /* FICImageCache.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; + 2E1BC8F117C57C4700836A7E /* FICImageFormat.m in Sources */ = {isa = PBXBuildFile; fileRef = 2E1BC8E617C57C4700836A7E /* FICImageFormat.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; + 2E1BC8F217C57C4700836A7E /* FICImageTable.m in Sources */ = {isa = PBXBuildFile; fileRef = 2E1BC8E817C57C4700836A7E /* FICImageTable.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; + 2E1BC8F317C57C4700836A7E /* FICImageTableChunk.m in Sources */ = {isa = PBXBuildFile; fileRef = 2E1BC8EA17C57C4700836A7E /* FICImageTableChunk.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; + 2E1BC8F417C57C4700836A7E /* FICImageTableEntry.m in Sources */ = {isa = PBXBuildFile; fileRef = 2E1BC8EC17C57C4700836A7E /* FICImageTableEntry.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; 2E1BC8FE17C57CDF00836A7E /* FICDAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 2E1BC8F717C57CD300836A7E /* FICDAppDelegate.m */; }; 2E1BC8FF17C57CDF00836A7E /* FICDPhoto.m in Sources */ = {isa = PBXBuildFile; fileRef = 2E1BC8F917C57CD300836A7E /* FICDPhoto.m */; }; 2E1BC90017C57CDF00836A7E /* FICDPhotosTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 2E1BC8FB17C57CD300836A7E /* FICDPhotosTableViewCell.m */; }; @@ -23,7 +23,7 @@ EB171332181F089F00EB0E24 /* CoreImage.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EB171331181F089F00EB0E24 /* CoreImage.framework */; }; EB642D8017DCB1750013D644 /* FICDFullscreenPhotoDisplayController.m in Sources */ = {isa = PBXBuildFile; fileRef = EB642D7F17DCB1750013D644 /* FICDFullscreenPhotoDisplayController.m */; }; EB6BD53818079DAB00D762CE /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EB6BD53718079DAB00D762CE /* CoreGraphics.framework */; }; - EB6BD53A18079EA800D762CE /* FICUtilities.m in Sources */ = {isa = PBXBuildFile; fileRef = 2E1BC8EE17C57C4700836A7E /* FICUtilities.m */; }; + EB6BD53A18079EA800D762CE /* FICUtilities.m in Sources */ = {isa = PBXBuildFile; fileRef = 2E1BC8EE17C57C4700836A7E /* FICUtilities.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; EBB922BD17DA8E6A00211050 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EBB922BC17DA8E6A00211050 /* QuartzCore.framework */; }; EBB922BF17DC08E900211050 /* Demo Images in Resources */ = {isa = PBXBuildFile; fileRef = EBB922BE17DC08E900211050 /* Demo Images */; }; EBC8A5F217FF6DEF007FECD4 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = EBC8A5F117FF6DEF007FECD4 /* Assets.xcassets */; };