gpt4 book ai didi

objective-c - 在运行时发现类的哪些实例变量被声明为 __weak

转载 作者:太空狗 更新时间:2023-10-30 03:33:25 26 4
gpt4 key购买 nike

我正在编写一个工具,如果知道类的哪些实例变量被声明为 __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

这只适用于弱 iVar。使用 unsafe_unretained 变量,它会给出误报,我对此的最佳猜测是因为 __weak 信息在运行时保存,而 unsafe_unretained 信息是不是。

希望对您有所帮助!

关于objective-c - 在运行时发现类的哪些实例变量被声明为 __weak,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11621028/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com