如何从NSString中提取对象

时间:2014-01-04 23:10:31

标签: objective-c object pointers nsstring

使用:

很容易将对象的类/地址作为字符串获取
NSString* objectInfoString = [object description];

返回的字符串类似<ClassName: fk10009567>,字母和数字代表它在内存中的唯一地址,据我所知。

或者,对于地址,只需使用带有%p占位符的格式化NSString。

NSString* addressString = [NSString stringWithFormat:@"%p",myObject];

那么可以从这个字符串信息创建一个指针吗? 例如:

NSObject* foo = [[NSObject alloc]init];
NSString* fooAddressString = [NSString stringWithFormat:@"%p",foo];

然后,我希望能够做到这样的事情:

NSObject* newFoo = [NSObject objectForAddressString:fooAddressString];

这样newFoo = foo就是真的。

2 个答案:

答案 0 :(得分:5)

这似乎不是一件好事或好事。依赖于对象的- description非常非常脆弱。为什么需要从描述中恢复对象?如果要序列化和反序列化对象,可以通过实现NSCoding协议来实现。如果要将对象与索引或键关联,可以使用NSArrayNSDictionary等...

然而,那说,可以从字符串中生成一个指针:

NSString *addr = @"0xbadf00d";
uintptr_t ptr = strtoull(addr.UTF8String, NULL, 0);
id obj = (id)ptr;

答案 1 :(得分:5)

基础API提供了一种特定的机制来实现这一点,而不使用“魔术字符串”,尽管可以使用stringWithFormat来实现它,我猜。 (如上所述,它会有些脆弱)。

获取对象的指针引用:

//Value now contains a pointer to the object, be careful it doesn't become dangling
NSValue* value = [NSValue valueWithPointer:(__bridge void*) myObject]; 

要从指针引用中取回对象:

//If not using ARC you can skip the (__bridge id) here, and change the above cast to just (void*)
MyObjectType* myObject = (__bridge id) [value pointerValue];

<强>脆弱吗

有人指出,使用'%p'获取指针值是脆弱的 - 而所有Objective-C实现当前都返回一个十六进制值,此的实现可以更改。在任何情况下,都有一个特定的API来执行它。

还要考虑在任何情况下保存对指针的引用都是脆弱的 :获得了一个必要的指针,以确保它不会变成'悬空' - 意味着被引用的对象在指针之前就消失了。应该使用与使用__unsafe_unretained(aka assign)内存选项相同的策略。 (这里没有自动弱引用!)

这种东西肯定是有效的应用程序,但它们非常专业,在日常应用程序编程中发现自己这样做是不寻常的。 (我收集到你的问题只是为了更深入地了解Objective-C - 为此获得荣誉)。

此技术的有效用途是什么?

一个有效的应用程序是在C ++类中保持对Objective-C对象的引用。 Box2d physics engine (C++)允许它提供与各种Objective-C sprite引擎的集成点。