我正在编写一个工具,可以从知道哪个类的实例变量声明__weak中受益.
这些信息必须存在于运行时的某个地方,但有没有办法访问它,记录或以其他方式? (这是一个工具,所以我不太关心它打破更新)
解决方法
好吧,这是一个使用自定义对象实现的示例实现,它执行初步检查以查看iVar是否弱:
BOOL iVarIsWeak(Class cls,Ivar ivar) { id classInstance = [cls new]; // our custom base class properly tracks reference counting,no weird voodoo id refCounter = [CustomBaseClass new]; object_setIvar(classInstance,ivar,refCounter); if ([refCounter refCount] == 2) { return NO; } return YES; }
上面的代码用于启用ARC,而以下自定义对象代码不是:
@interface CustomBaseClass : NSObject +(id) new; +(id) alloc; -(id) init; -(id) retain; -(void) release; -(id) autorelease; -(void) dealloc; -(id) description; -(unsigned) refCount; @end // easy way to get sizeof struct CustomBaseClassAsStruct { voidPtr isa; unsigned volatile refcount; }; @implementation CustomBaseClass { unsigned volatile refcount; } +(id) new { return [[self alloc] init]; } +(id) alloc { struct CustomBaseClassAsStruct *results = malloc(sizeof(struct CustomBaseClassAsStruct)); results->isa = self; results->refcount = 0; return (id) results; } -(id) init { [self retain]; return self; } -(id) retain { ++refcount; return self; } -(void) release { if (--refcount == 0) [self dealloc]; } -(id) autorelease { // sample implementation of autorelease dispatch_async(dispatch_get_current_queue(),^{ [self release]; }); return self; } -(unsigned) refCount { return refcount; } -(void) dealloc { free(self); // no call to [super dealloc],we are using custom memory-managment } @end
这仅适用于弱iVars.使用unsafe_unretained变量,它会产生误报,我最好的猜测是因为__weak信息在运行时保存,而unsafe_unretained信息则没有.
我希望这有帮助!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。