这些信息必须存在于运行时的某个地方,但有没有办法访问它,记录或以其他方式? (这是一个工具,所以我不太关心它打破更新)
解决方法 好吧,这是一个使用自定义对象实现的示例实现,它执行初步检查以查看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) @R_404_6843@release;-(voID) dealloc;-(ID) description;-(unsigned) refCount;@end// easy way to get sizeofstruct 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) @R_404_6843@release{ // sample implementation of @R_404_6843@release 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信息则没有.
我希望这有帮助!
总结以上是内存溢出为你收集整理的objective-c – 在运行时发现哪个类的实例变量被声明为__weak全部内容,希望文章能够帮你解决objective-c – 在运行时发现哪个类的实例变量被声明为__weak所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)