On Mar 10, 2012, at 11:05 PM, Antonio Nunes wrote:
> In the latest public release of my software, I used method swizzling to force 
> creation of my subclass when the system tries to create instances of its 
> superclass. However, I have received a very few reports where apparently 
> instances of the superclass are still created, and wreak havoc (i.e. they 
> cause a crash). In what way is it still possible for instances of the 
> superclass to be created?
> 
> + (void)initialize
> {
>       // To force PDFDocuments to be created as NMD_PDFDocuments
>       // Necessary because of an issue with PDFThumbnailView
>       Method originalMethod = class_getClassMethod([PDFDocument class], 
> @selector(allocWithZone:));
>       Method superMethod = 
> class_getClassMethod(class_getSuperclass([PDFDocument class]), 
> @selector(allocWithZone:));
>       
>       Method replacedMethod = class_getClassMethod([PDFDocument class], 
> @selector(allocWithZoneReplacement:));
>       if (superMethod == originalMethod) {
>               class_addMethod(object_getClass([PDFDocument class]), 
> @selector(allocWithZone:), 
>                                               
> method_getImplementation(replacedMethod),
>                                               
> method_getDescription(replacedMethod)->types);
>       }
> 
>       // To force PDFPages to be created as NMD_PDFPage
>       originalMethod = class_getClassMethod([PDFPage class], 
> @selector(allocWithZone:));
>       superMethod = class_getClassMethod(class_getSuperclass([PDFPage 
> class]), @selector(allocWithZone:));
>       
>       replacedMethod = class_getClassMethod([PDFPage class], 
> @selector(allocWithZoneReplacement:));
>       if (superMethod == originalMethod) {
>               class_addMethod(object_getClass([PDFPage class]), 
> @selector(allocWithZone:), 
>                                               
> method_getImplementation(replacedMethod),
>                                               
> method_getDescription(replacedMethod)->types);
>       }
> }

Note that your code does nothing if PDFPage or PDFDocument themselves override 
+allocWithZone:. Do you know whether that may be the case?


> The swizzling is performed early on during the application startup:

If you want to be absolutely sure your swizzling is performed early on during 
application startup, use a +load method instead of a +initialize method.


-- 
Greg Parker     gpar...@apple.com     Runtime Wrangler



_______________________________________________

Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)

Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com

Help/Unsubscribe/Update your Subscription:
https://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

This email sent to arch...@mail-archive.com

Reply via email to