Le 13 août 2012 à 19:54, John McCall <rjmcc...@apple.com> a écrit :
> On Aug 13, 2012, at 9:29 AM, Jean-Daniel Dupas wrote: >> Le 13 août 2012 à 17:56, Kyle Sluder <k...@ksluder.com> a écrit : >>> On Aug 13, 2012, at 8:42 AM, Ben <ben_cocoa_dev_l...@yahoo.co.uk> wrote: >>> >>>> I see in the documentation - and from a compiler error - that some classes >>>> are not compatible with weak references. >>>> >>>> What makes these classes incompatible? >>> >>> They have custom implementations of -retain and -release. >>> >>> When NextSTEP was first released, there was no refcounting, just +new and >>> +free. That's why NSObject (actually Object at the time) has only one ivar: >>> isa, a pointer to the object's class. >>> >>> Some time later -retain and -release came into being, but the storage for >>> refcount couldn't be added to Object because of the fragile base class >>> problem—all existing code expected sizeof(Object)==sizeof(id), so they >>> hardcoded offsets for accessing subclass ivars. >> >> I don't get it. retain/release has been introduced by NSObject. >> As all classed that use ref counting are based on NSObject and not Object, >> it was perfectly possible to declare 2 ivars in NSObject without breaking >> anything when it was first introduced. > > In the so-called "fragile" ABI, which is what you get on PPC, PPC64, and > i386, class layout is performed at compile time, and the machine code pattern > for accessing an ivar is the same as accessing a struct member: the compiler > knows that 'int count;' is at offset 32 (say), so it just adds 32 to the base > pointer value to find the address of the ivar. This is why all ivars have to > be declared in the main @interface when compiling for these platforms: it > would otherwise be impossible to do class layout for subclasses. Adding an > ivar to a class would change that layout, causing all code with class layouts > or ivar accesses compiled against the existing layout to stop working. > > There were releases made with NSObject having no ivars (except 'isa'). > Therefore adding new ivars would have broken binary compatibility with those > releases. Thanks for the details. I know what the fragile ABI, and the modern ABI are but where I don't agree is when Kyle says that it was not possible to add a refcount ivar when retain/release was introduced. As retain/release was already defined in the first OpenStep specification (http://www.gnustep.org/resources/OpenStepSpec/FoundationKit/Protocols/NSObject.html), it was perfectly possible at that time to choose to add a refcount ivar to the new NSObject class without breaking anything. I don't know the rational behind this choice, but it was probably to not force all classes to have an eventually useless ivar (constant NSString for instance don't need it). -- Jean-Daniel _______________________________________________ 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