Я хочу передать некоторые данные при публикации уведомлений, данные - это словарь, содержащий информацию о локальном уведомлении.iOS NSString stringWithString вызывает утечку памяти при использовании ARC
- (void)application:(UIApplication *)application
didReceiveLocalNotification:(UILocalNotification *)notification {
NSString *uuid = [NSString stringWithString:notification.userInfo[@"UUID"]];
NSDictionary *infoDic = @{
@"UUID" :uuid
};
if ([UIApplication sharedApplication].applicationState == UIApplicationStateActive) {
[[NSNotificationCenter defaultCenter]
postNotificationName:@"PopReminder"
object:nil
userInfo:infoDic];
}
}
Уведомление, как notification.userInfo = @{ @"UUID" : list.itemKey }
.
И list.itemKey - это строка для определения конкретного списка.
NSUUID *uuid = [[NSUUID alloc] init]; NSString *key = [uuid UUIDString]; list.itemKey = key;
Но когда тест с использованием Leak, он показал объект NSString вызывает утечку памяти. Как метод класса вызовет утечку памяти и использует ARC. Может ли кто-нибудь помочь найти решение? Благодарю.
решаемые по-другому, но до сих пор неясно, о причине утечки:
- (void)application:(UIApplication *)application
didReceiveLocalNotification:(UILocalNotification *)notification {
NSString *uuid;
NSArray *lists = [YYList MR_findAll];
for (YYList *list in lists) {
if ([list.itemKey isEqualToString:notification.userInfo[@"UUID"]]) {
uuid = [list.itemKey copy];
}
}
if ([UIApplication sharedApplication].applicationState == UIApplicationStateActive) {
[[NSNotificationCenter defaultCenter]
postNotificationName:@"PopReminder"
object:nil
userInfo:@{
@"UUID" :uuid
}];
}
}
Таким образом, он хорошо работает. Но все же вы хотите знать, почему нельзя напрямую использовать [notification.userInfo [@ "UUID]] для передачи данных. И в «Утечке» он показывает, что это цикл утечки, возможно, это ключ к тому, чтобы указать что-то, что я пропустил. Если это так, то почему UILocalNotification 'уведомление' и NSNotification 'PopReminder' сохраняют друг друга?
use stringWithFormat, а не stringWithString – Geet
Вам нужно создать новую строку? 'copy' @Geet не использовать' stringWithFormat: ', если у вас на самом деле нет формата для обработки ... – Wain
обрабатывает объект в строке, поэтому в этот момент вам нужно использовать stringWithFormat – Geet