Re: Forcing subclass creation through method swizzling not airtight?
Re: Forcing subclass creation through method swizzling not airtight?
- Subject: Re: Forcing subclass creation through method swizzling not airtight?
- From: Greg Parker <email@hidden>
- Date: Mon, 12 Mar 2012 09:57:51 -0700
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 email@hidden Runtime Wrangler
_______________________________________________
Cocoa-dev mailing list (email@hidden)
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:
This email sent to email@hidden