> On Jun 8, 2016, at 10:52, Joe Groff via swift-dev <swift-dev@swift.org> wrote:
> 
>> 
>> On Jun 8, 2016, at 12:44 AM, Yavuz Nuzumlalı via swift-dev 
>> <swift-dev@swift.org> wrote:
>> 
>> Hi all,
>> 
>> swift_dynamicCastClassUnconditional and 
>> swift_dynamicCastObjCClassUnconditional methods behave differently while 
>> verifying casting.
>> 
>> swift_dynamicCastObjCClassUnconditional method calls -isKindOfClass: method 
>> before falling back to object_getClass function.
>> 
>> swift_dynamicCastClassUnconditional method calls swift_dynamicCastClass 
>> method which calls _swift_getClassOfAllocated method which calls directly 
>> object_getClass function.
>> 
>> This causes problems if underlying object is an NSProxy subclass.
>> 
>> NSProxy class does not implement -isKindOfClass: method, so calls to this 
>> method are forwarded to the real object through -forwardInvocation: method, 
>> which causes -isKindOfClass: method to return answer according to the real 
>> object's class.
>> 
>> However, object_getClass function directly accesses to the metadata of the 
>> given object, so it returns NSProxy subclass.
>> 
>> I think this is a conflicting behavior, and I think 
>> swift_dynamicCastClassUnconditional method should also verify first using 
>> -isKindOfClass: method, in order to provide consistency.
> 
> This is intentional, since NSProxy instances are generally expected to be 
> standins for the proxied object. Important Cocoa idioms break down if the 
> "real" class is exposed instead of the class a proxy pretends to be.

For a little more detail, Swift relies on a bit more information about layout 
of both instances and classes than Objective-C does, so an NSProxy stand-in 
wouldn't work for a Swift type. (And by "wouldn't work" I mean "would crash 
your program".) However, for an Objective-C type, all accesses Swift does will 
always go through the Objective-C runtime, so it's safe to use an 
Objective-C-style proxy, and indeed some Cocoa APIs expect this.

This is probably something we could stand to document more explicitly, but I'm 
not sure where.

Jordan

_______________________________________________
swift-dev mailing list
swift-dev@swift.org
https://lists.swift.org/mailman/listinfo/swift-dev

Reply via email to