On 12 Mar 2012, at 16:57, Greg Parker wrote:

> 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?

I don't think that is the case. The code works fine almost always. If the 
superclasses themselves overrode +allocWIthZone: I suppose my code would never 
run, right? I think I've only seen a single source with a few crash reports 
where PDFPages had been created instead of NMD_PDFPages. So, doesn't that 
suggest that my code works (at least most of the time)?

>> 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.

OK, I've change it to a +load method. We'll see if I no longer receive crash 
reports referencing misbehaving PDFPages.

Thanks Greg,
António

-----------------------------------------------------------
And could you keep your heart in wonder
at the daily miracles of your life,
your pain would not seem less wondrous
than your joy.

--Kahlil Gibran
-----------------------------------------------------------




_______________________________________________

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