Программно отображать iPhone / iPad UDID - PullRequest
4 голосов
/ 29 июля 2010

У меня есть приложение для iPad, в котором я получаю UDID устройства с помощью следующего кода в методе viewDidLoad.

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

Я хотел удалить тире в строке.

Позже, в другом вызове метода, я пытаюсь получить доступ к этой строке uid (которая является свойством этого класса),

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

и я получаю следующее в окне консоли, когда пытаюсь распечатать его.

Loading request with UDID: (
    <WebView: 0x4b0fb90>
)

Почему он печатает адрес памяти, а не саму строку? Спасибо!

Ответы [ 3 ]

10 голосов
/ 29 июля 2010

Проблема, с которой вы столкнулись, связана с управлением памятью.У меня была именно эта проблема раньше.

Когда вы NSLog uid, вы получаете адрес для объекта WebView.Почему это происходит, когда uid является строкой NSString ???Позвольте мне познакомить вас с магией управления памятью: D

Когда вы установили переменную uid в этой строке:

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

То, что вы сделали, - это присвоение автоматически выпущенной переменнойUID.Это означает, что он будет освобожден, и это место в памяти будет доступно для захвата.Между окончанием работы этой функции и последующим доступом к ней она была выпущена и что-то еще там было сохранено.

Как это исправить?Когда вы присваиваете что-то свойству, например, uid, ВСЕГДА делаете это с помощью методов установки, созданных объявлением @property.Используйте либо self.uid = string, либо [self setUid:string.Это правильно освободит старую строку и сохранит новую.

Это проблема, которая стоила мне МНОГО МНОГО часов, пытаясь найти проблемную строку.Еще один симптом, который может возникнуть, - сбой программы при попытке отправить сообщение освобожденному объекту.Их может быть ОЧЕНЬ сложно отследить.Надеюсь, мой ответ поможет вам, и вам не придется терпеть это разочарование:)

Удачи!

3 голосов
/ 29 июля 2010

NSLog ("...") должно быть NSLog (@ "...")

2 голосов
/ 17 сентября 2013

uniqueIdentifier был перезапущен с iOS 5.

Вы должны использовать другую функцию:

[[[UIDevice currentDevice] identifierForVendor] UUIDString]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...