|
|
|
@ -20,14 +20,29 @@ int dealloc = 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
@end
|
|
|
|
@end
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@interface EmptySubFoo : Foo
|
|
|
|
|
|
|
|
@end
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@implementation EmptySubFoo
|
|
|
|
|
|
|
|
@end
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@interface NonEmptySubFoo : Foo
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
__strong id ignored;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
@end
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@implementation NonEmptySubFoo
|
|
|
|
|
|
|
|
@end
|
|
|
|
|
|
|
|
|
|
|
|
void setIvar(id obj, const char * name, id val)
|
|
|
|
void setIvar(id obj, const char * name, id val)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
object_setIvar(obj, class_getInstanceVariable(object_getClass(obj), name), val);
|
|
|
|
object_setIvar(obj, class_getInstanceVariable(object_getClass(obj), name), val);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int main(void)
|
|
|
|
void testIvarsOn(Foo* f)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
Foo *f = [Foo new];
|
|
|
|
dealloc = 0;
|
|
|
|
Dealloc *d = [Dealloc new];
|
|
|
|
Dealloc *d = [Dealloc new];
|
|
|
|
__unsafe_unretained Dealloc *dead;
|
|
|
|
__unsafe_unretained Dealloc *dead;
|
|
|
|
setIvar(f, "w", d);
|
|
|
|
setIvar(f, "w", d);
|
|
|
|
@ -48,5 +63,15 @@ int main(void)
|
|
|
|
setIvar(f, "s", nil);
|
|
|
|
setIvar(f, "s", nil);
|
|
|
|
assert(dealloc == 1);
|
|
|
|
assert(dealloc == 1);
|
|
|
|
assert(f->s == nil);
|
|
|
|
assert(f->s == nil);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int main (void)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
/* Test for ivars in the same class */
|
|
|
|
|
|
|
|
testIvarsOn([Foo new]);
|
|
|
|
|
|
|
|
/* Test for ivars in the superclass (receiver ivar list empty) */
|
|
|
|
|
|
|
|
testIvarsOn([EmptySubFoo new]);
|
|
|
|
|
|
|
|
/* Test for ivars in the superclass (receiver ivar list non-empty) */
|
|
|
|
|
|
|
|
testIvarsOn([NonEmptySubFoo new]);
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|