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>
)

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

4

3 回答 3

10

您遇到的问题与内存管理有关。我以前也遇到过这个问题。

当您 NSLog uid 时,您得到的是 WebView 对象的地址。为什么当 uid 是 NSString 时会发生这种情况???让我带您领略内存管理的魔力:D

当您在此行设置 uid 变量时:

uid = [uid stringByReplacingOccurrencesOfString:@"-" withString:@""];

您所做的是将一个自动释放的变量分配给 uid。这意味着它将被释放,并且该内存位置将可供争夺。在这个函数结束和你下次访问它之间,它已经被释放并且其他东西被存储在那里。

你如何解决这个问题?当您将某些东西分配给像 uid 这样的属性时,总是通过 @property 声明创建的 setter 方法来完成。使用self.uid = string[self setUid:string。这将正确释放旧字符串并保留新字符串。

这是一个花费我很多时间试图找到有问题的线路的问题。另一个可能发生的症状是当您尝试向已释放对象发送消息时程序崩溃。这些可能很难追踪。希望我的回复对您有所帮助,您不必忍受这种沮丧:)

祝你好运!

于 2010-07-29T06:08:52.503 回答
3

NSLog("...") 应该是 NSLog(@"...")

于 2010-07-29T04:39:58.513 回答
2

uniqueIdentifier已从 iOS 5 弃用。

您应该使用其他功能:

[[[UIDevice currentDevice] identifierForVendor] UUIDString]
于 2013-09-17T06:33:13.950 回答