Greg, Thanks! that was pretty fast and efective. Now I got it right
On Tue, Mar 5, 2013 at 11:37 AM, Greg Parker <gpar...@apple.com> wrote: > On Mar 4, 2013, at 6:23 PM, Ignacio Enriquez <nach...@gmail.com> 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 gpar...@apple.com Runtime Wrangler > > > -- Ignacio _______________________________________________ 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