4

viewDidLoadメソッドの次のコードでデバイスのUDIDを取得するiPadアプリがあります。

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

あなたが抱えている問題は、メモリ管理に関係しています。私は以前にまさにこの問題を抱えていました。

uidをNSLogすると、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

uniqueIdentifieriOS5から廃止されました。

他の関数を使用する必要があります:

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