以编程方式显示iPhone/iPad的UDID

4

我有一个iPad应用程序,在其中通过以下代码在viewDidLoad方法中获取设备的UDID。

uid = [[UIDevice currentDevice] uniqueIdentifier];
uid = [uid stringByReplacingOccurrencesOfString:@"-" withString:@""];

我希望删除字符串中的破折号。

后来,在另一个方法调用中,我尝试访问这个uid字符串(它是该类的属性),

NSLog("Loading request with UDID: %@", uid);

当我尝试打印它时,控制台窗口会显示以下内容。
Loading request with UDID: (
    <WebView: 0x4b0fb90>
)

为什么它打印的是内存地址而不是字符串本身?谢谢!

1
哦...UDID中不应该有破折号。 - jtbandes
那行代码的第一行会返回一个带有破折号的字符串。我保证。 - Liam
在模拟器还是设备上?我记得模拟器对此有些奇怪。不过所有的设备都有纯十六进制、小写的 UDID。 - jtbandes
使用uniqueIdentifier是否符合苹果公司的规定?我认为他们不希望开发者保存这个信息。 - quantumpotato
3个回答

10

你遇到的问题与内存管理有关。我之前也遇到过完全相同的问题。

当你NSLog uid时,所得到的是一个WebView对象的地址。为什么会发生这种情况呢?uid明明是一个NSString类型?让我带你进入内存管理的神奇世界吧 :D

当你在这行代码中设置uid变量时:

uid = [uid stringByReplacingOccurrencesOfString:@"-" withString:@""];
你所做的是将一个自动释放变量分配给uid。这意味着它将被释放,该内存位置将变得可用。在这个函数结束和下一次访问之间,它已经被释放,并且另一个东西被存储在那里。
如何解决这个问题?当你像uid这样的属性分配某些内容时,总是通过@property声明创建的setter方法来完成。使用self.uid = string或者[self setUid:string。这将正确释放旧字符串并保留新字符串。
这是一个花费我很多时间寻找问题所在的问题。另一个可能发生的症状是在尝试向一个已释放对象发送消息时程序会崩溃。这些问题可能非常难以追踪。希望我的回答对你有所帮助,这样你就不必忍受那种挫败感了 :)
祝好运!

非常感谢!我简直不敢相信我从来没有想到过使用self。是的,这是一个非常难以追踪的错误。我总是无法弄清楚为什么我要打印内存地址而不是值。 - Liam
丹,我不认为这是问题所在。自动释放的实例会在程序离开创建该实例的范围后随其自动释放池一起释放。因此,通常不需要保留仅用于给定范围内部局部使用的对象。我相信@Liam的问题出在nacho4d的回答上。 - eddy

3

NSLog("...") 应该改为 NSLog(@"...")


顺便说一下,您不需要执行 [uid stringByReplacingOccurrencesOfString:@"-" withString:@""]; 原始字符串不包含任何“-”。 - nacho4d
嗯,我可能把需要字符串替换的其他代码和这个搞混了。而且,我在输入 NSLog(@"..."); 时犯了一个错误。 - Liam
实际上,我刚刚再次检查了一下。它确实有短线。 - Liam

2

uniqueIdentifier在iOS 5中已被弃用。

你应该使用其他函数:

[[[UIDevice currentDevice] identifierForVendor] UUIDString]

然而,对于模拟器设备,在iOS 9.3(及之前版本)中,identifierForVendor返回的ID在每次新运行应用程序时都不同,因此并不是非常有用。在iOS 10.1中,它是一个一致的标识符。 - jk7

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接