nicklockwood / AutoCoding

AutoCoding is a category on NSObject that provides automatic support for NSCoding and NSCopying to every object.
Other
1.07k stars 131 forks source link

nullable e crash fix #31

Open souzainf3 opened 7 years ago

souzainf3 commented 7 years ago

Hi, any suggestions to fix crash and swift usage.

  1. Add on 'objectWithContentsOfFile' the 'nullable' flag to Swift optional compatibility.
  2. Try|catch on 'unarchiveObjectWithData:'.

Bellow the implementation of suggestions.

+ (nullable instancetype)objectWithContentsOfFile:(NSString *)filePath
{
    //load the file
    NSData *data = [NSData dataWithContentsOfFile:filePath];

    //attempt to deserialise data as a plist
    id object = nil;
    if (data)
    {
        NSPropertyListFormat format;
        object = [NSPropertyListSerialization propertyListWithData:data options:NSPropertyListImmutable format:&format error:NULL];

        //success?
        if (object)
        {
            //check if object is an NSCoded unarchive
            if ([object respondsToSelector:@selector(objectForKeyedSubscript:)] && ((NSDictionary *)object)[@"$archiver"])
            {
                @try {

                    object = [NSKeyedUnarchiver unarchiveObjectWithData:data];
                }
                @catch (NSException* exception) {
                    NSLog(exception);
                    // delete corrupted archive
                    // initialize libraryDat from scratch
                }
            }
        }
        else
        {
            //return raw data
            object = data;
        }
    }

    //return object
    return object;
}