Swi*_*fty 2 pointers object objective-c nsstring
使用以下方法很容易将对象的类/地址作为字符串获取:
NSString* objectInfoString = [object description];
Run Code Online (Sandbox Code Playgroud)
返回的字符串是这样的<ClassName: fk10009567>,字母和数字代表它在内存中的唯一地址,据我所知.
或者,对于地址,只需使用带有%p占位符的格式化NSString.
NSString* addressString = [NSString stringWithFormat:@"%p",myObject];
Run Code Online (Sandbox Code Playgroud)
那么可以从这个字符串信息创建一个指针吗?例如:
NSObject* foo = [[NSObject alloc]init];
NSString* fooAddressString = [NSString stringWithFormat:@"%p",foo];
Run Code Online (Sandbox Code Playgroud)
然后,我希望能够做到这样的事情:
NSObject* newFoo = [NSObject objectForAddressString:fooAddressString];
Run Code Online (Sandbox Code Playgroud)
这样newFoo = foo就是真的.
小智 5
这似乎不是什么理智或好事.依赖于- description一个对象是非常非常脆弱的.为什么需要从描述中恢复对象?如果要序列化和反序列化对象,可以通过实现NSCoding协议来实现.如果要将对象与索引或键关联,可以使用NSArray或NSDictionary等...
也就是说,你可以用字符串制作一个指针:
NSString *addr = @"0xbadf00d";
uintptr_t ptr = strtoull(addr.UTF8String, NULL, 0);
id obj = (id)ptr;
Run Code Online (Sandbox Code Playgroud)
基础API为这样做提供了一种特定的机制,而不使用"魔术字符串",尽管你可以使用stringWithFormat来实现,我想.(如上所述,它会有些脆弱).
要获取对象的指针引用:
//Value now contains a pointer to the object, be careful it doesn't become dangling
NSValue* value = [NSValue valueWithPointer:(__bridge void*) myObject];
Run Code Online (Sandbox Code Playgroud)
要从指针引用返回对象:
//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];
Run Code Online (Sandbox Code Playgroud)
脆弱?
有人指出,使用'%p'获取指针值是脆弱的 - 而所有Objective-C实现当前都返回一个十六进制值,这可能会改变.在任何情况下,都有一个特定的API来执行它.
还要考虑到,在任何情况下保存对指针的引用本质上都是脆弱的:获得了一个必要的指针以确保它不会变成"悬空" - 意味着被引用的对象在指针之前就消失了.应该使用与使用__unsafe_unretained(aka assign)内存选项相同的策略.(这里没有自动弱引用!)
这种东西肯定是有效的应用程序,但它们非常专业,在日常的应用程序编程中发现自己这样做是不寻常的.(我收集到你的问题只是为了更深入地了解Objective-C - 对此有所了解).
这种技术的有效用途是什么?
一个有效的应用程序是在C++类中保持对Objective-C对象的引用.所述的Box2D物理引擎(C++)允许这为用户提供各种目标C精灵发动机的集成点.
| 归档时间: |
|
| 查看次数: |
163 次 |
| 最近记录: |