如果object_getIvar中的变量是基本数据类型(例如,float,int,bool),我如何根据文档返回指针(id)来获取值.我已经尝试转换为int,int*但是当我尝试将其转换为NSLog时,我收到有关不兼容指针类型的错误.
基于此处描述的技术,我使用ivar_getOffset()方法在对象实例中设置ivars.
现在我的情况是ivar是一个NSString*:
NSString* _name;
Run Code Online (Sandbox Code Playgroud)
更新:
我在错误的轨道上(在这种情况下不能使用ivar_getOffset),我应该使用:
object_setIvar(target, _ivar, [stringValue copy]);
Run Code Online (Sandbox Code Playgroud)
将对象值分配给ivars.
我的问题仍然存在:在ARC下这样做是否安全?ARC的现有物体是否会被ARC正确释放?
我担心ARC可能无法正确释放ivar在作业之前设置的任何字符串.虽然我对此表示怀疑,否则编译器不会让我喜欢object_setInstanceVariable("在自动引用计数模式下不可用") - 对吗?
objective-c variable-assignment objective-c-runtime ivar automatic-ref-counting
在某些上下文中(例如,当挂钩到内部进行测试时),能够创建不采用NSCopying(不实现-copyWithZone:)的类的实例的副本将是方便的.怎么能实现这一目标?(注意:在类别中实现协议是不够的,因为并非所有类的实例变量都在其标题中可见.)
我已经试过遍历对象的Ivars和(1)对象类型递归(或保留),和(2)的基本类型,获得在原有的实例化而这正在取得和拷贝伊娃的地址memcpy荷兰国际集团缓冲区从源ivar的地址开始到目的地ivar的地址.
@interface NSObject (ADDLCopy)
- (id)addl_generateCopyDeep:(BOOL)deepCopy;
@end
@implementation NSObject (ADDLCopy)
//modified from http://stackoverflow.com/a/12265664/1052673
- (void *)addl_ivarPointerForName:(const char *)name
{
void *res = NULL;
Ivar ivar = class_getInstanceVariable(self.class, name);
if (ivar) {
res = (void *)self + ivar_getOffset(ivar);
}
return res;
}
- (id)addl_generateCopyDeep:(BOOL)deepCopy;
{
id res = [[self.class alloc] init];
unsigned int count = 0;
Ivar *ivars = class_copyIvarList(self.class, &count);
for (unsigned int i = 0; i < count; i++) { …Run Code Online (Sandbox Code Playgroud)