Skip to content

Instantly share code, notes, and snippets.

@0xced
Created April 1, 2012 12:24

Revisions

  1. 0xced revised this gist Apr 1, 2012. 1 changed file with 104 additions and 3 deletions.
    107 changes: 104 additions & 3 deletions NSString.m
    Original file line number Diff line number Diff line change
    @@ -1,3 +1,9 @@
    /*
    * Most NSString instances will actually be __NSCFString instances, so here are both NSString and __NSCFString implementations.
    * If you know how to create an NSString instance whose class is actually NSString please let me know.
    * Other possible concrete subclasses of NSString are: NSConstantString, __NSCFConstantString, NSPathStore2, NSSimpleCString and __NSLocalizedString.
    */

    // CoreFoundation.framework 635.19.0 (Mac OS X 10.7.3)
    @implementation NSObject

    @@ -10,11 +16,106 @@ - (BOOL) isNSString__

    @implementation __NSCFString

    static CFStringEncoding enc = 0;

    - (BOOL) isNSString__
    {
    return YES;
    }

    - (BOOL) isEqual:(id)string
    {
    if (self == string)
    {
    return YES;
    }
    else if (string == nil)
    {
    return NO
    }
    else
    {
    Class stringClass = [string class];
    Class nscfStringClass = objc_lookUpClass("__NSCFString");
    if (stringClass == nscfStringClass || class_getSuperclass(stringClass) == nscfStringClass)
    {
    if (enc == kCFStringEncodingInvalidId)
    enc = CFStringGetSystemEncoding();

    const char *selfCString = CFStringGetCStringPtr(self, enc);

    if (enc == kCFStringEncodingInvalidId)
    enc = CFStringGetSystemEncoding();

    const char *argCString = CFStringGetCStringPtr(string, enc);

    if (selfCString != NULL && argCString != NULL)
    {
    CFIndex length = _CFStringGetLength2(self);
    if (length == _CFStringGetLength2(string))
    {
    return memcmp(selfCString, argCString, length) == 0;
    }
    else
    {
    return NO;
    }
    }
    }
    }

    if (![string isNSString__])
    return NO;

    // Eventually calls __CFStringEqual whose implementation is available at http://opensource.apple.com/source/CF/CF-635.19/CFString.c
    return CFEqual(self, string);
    }

    - (BOOL) isEqualToString:(NSString *)string
    {
    if (self == string)
    {
    return YES;
    }
    else if (string == nil)
    {
    return NO
    }
    else
    {
    Class stringClass = [string class];
    Class nscfStringClass = objc_lookUpClass("__NSCFString");
    if (stringClass == nscfStringClass || class_getSuperclass(stringClass) == nscfStringClass)
    {
    if (enc == kCFStringEncodingInvalidId)
    enc = CFStringGetSystemEncoding();

    const char *selfCString = CFStringGetCStringPtr(self, enc);

    if (enc == kCFStringEncodingInvalidId)
    enc = CFStringGetSystemEncoding();

    const char *argCString = CFStringGetCStringPtr(string, enc);

    if (selfCString != NULL && argCString != NULL)
    {
    CFIndex length = _CFStringGetLength2(self);
    if (length == _CFStringGetLength2(string))
    {
    return memcmp(selfCString, argCString, length) == 0;
    }
    else
    {
    return NO;
    }
    }
    }
    }

    // Eventually calls __CFStringEqual whose implementation is available at http://opensource.apple.com/source/CF/CF-635.19/CFString.c
    return CFEqual(self, string);
    }

    @end

    // Foundation.framework 833.24.0 (Mac OS X 10.7.3)
    @@ -25,10 +126,10 @@ - (BOOL) isNSString__
    return YES;
    }

    - (BOOL) isEqual:(id)object
    - (BOOL) isEqual:(id)string
    {
    if ([object isNSString__])
    return [self isEqualToString:object];
    if ([string isNSString__])
    return [self isEqualToString:string];
    else
    return NO;
    }
  2. 0xced created this gist Apr 1, 2012.
    44 changes: 44 additions & 0 deletions NSString.m
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,44 @@
    // CoreFoundation.framework 635.19.0 (Mac OS X 10.7.3)
    @implementation NSObject

    - (BOOL) isNSString__
    {
    return NO;
    }

    @end

    @implementation __NSCFString

    - (BOOL) isNSString__
    {
    return YES;
    }

    @end

    // Foundation.framework 833.24.0 (Mac OS X 10.7.3)
    @implementation NSString

    - (BOOL) isNSString__
    {
    return YES;
    }

    - (BOOL) isEqual:(id)object
    {
    if ([object isNSString__])
    return [self isEqualToString:object];
    else
    return NO;
    }

    - (BOOL) isEqualToString:(NSString *)string
    {
    if (self == string)
    return YES;
    else
    return [self compare:string options:NSLiteralSearch range:NSMakeRange(0, [self length])] == NSOrderedSame;
    }

    @end