相关疑难解决方法(0)

如何在返回指针时从object_getIvar(self,myIntVar)获取int值

如果object_getIvar中的变量是基本数据类型(例如,float,int,bool),我如何根据文档返回指针(id)来获取值.我已经尝试转换为int,int*但是当我尝试将其转换为NSLog时,我收到有关不兼容指针类型的错误.

variables objective-c return-value objective-c-runtime

7
推荐指数
1
解决办法
5037
查看次数

在ARC下,使用运行时方法分配给对象类型的ivar是否合法/安全?

基于此处描述技术,我使用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

4
推荐指数
1
解决办法
579
查看次数

如何为不采用NSCopying的类创建对象实例的副本?

在某些上下文中(例如,当挂钩到内部进行测试时),能够创建不采用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)

objective-c objective-c-runtime

3
推荐指数
1
解决办法
374
查看次数