使用:
很容易将对象的类/地址作为字符串获取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就是真的。
答案 0 :(得分:5)
这似乎不是一件好事或好事。依赖于对象的- description
非常非常脆弱。为什么需要从描述中恢复对象?如果要序列化和反序列化对象,可以通过实现NSCoding
协议来实现。如果要将对象与索引或键关联,可以使用NSArray
或NSDictionary
等...
然而,那说,可以从字符串中生成一个指针:
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引擎的集成点。