Re: getting ivar of fundamental types with object_getInstanceValue
Re: getting ivar of fundamental types with object_getInstanceValue
- Subject: Re: getting ivar of fundamental types with object_getInstanceValue
- From: Ignacio Enriquez <email@hidden>
- Date: Tue, 05 Mar 2013 14:40:43 +0900
Greg, Thanks! that was pretty fast and efective. Now I got it right
On Tue, Mar 5, 2013 at 11:37 AM, Greg Parker <email@hidden> wrote:
> On Mar 4, 2013, at 6:23 PM, Ignacio Enriquez <email@hidden> wrote:
> > I am trying to understand the correct usage and caveats, of
> > object_setInstanceValue function from objc/objc-runtime.h.
> >
> > Recently I found this code:
> >
> > object_setInstanceVariable(foo, "_isRevealed", (void*)YES);
> >
> > where foo is:
> >
> > @interface Foo : NSObject{
> > double _doubled;
> > NSObject *obj;
> > BOOL _booled;
> > BOOL _isRevealed;
> > BOOL _isBar;
> > }
> > ...
> > - (NSString *)description {
> > return [NSString stringWithFormat:@"%p %f, %@, %d %d %d", self,
> _doubled,
> > _obj, _booled, _isRevealed, _isBar];
> > }
> > @end
> >
> > An old post in this list (Re: ivars and fundamental types -
> > http://lists.apple.com/archives/cocoa-dev/2010/Oct/msg00402.html)
> suggests
> > its brother object_getInstanceValue function should not be used for
> > fundamental types, only objects. "It happens to work for pointer-size
> > non-object values -- Greg Parker". I am trying this in the iOS simulator
> > and even though BOOL (size=1) and pointers (size=4) are not the same size
> > it seems to work.
>
> It doesn't work. object_setInstanceVariable() will write a 4-byte value to
> your 1-byte ivar. That may set your ivar correctly, but it will also
> trample on other nearby ivars.
>
> Example:
>
> foo = [Foo new];
> foo->_booled = YES;
> foo->_isRevealed = YES;
> foo->_isBar = YES;
> NSLog(@"before %@", foo);
> object_setInstanceVariable(foo, "_isRevealed", (void*)NO);
> NSLog(@"after %@", foo);
>
> 2013-03-04 18:32:46.832 a.out[77319:303] before 0x7ae13ff0 0.000000,
> (null), 1 1 1
> 2013-03-04 18:32:46.834 a.out[77319:303] after 0x7ae13ff0 0.000000,
> (null), 1 0 0
>
> Note that object_setInstanceVariable() incorrectly set two of your ivars
> to NO.
>
>
> --
> Greg Parker email@hidden Runtime Wrangler
>
>
>
--
Ignacio
_______________________________________________
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