1

Я хочу передать некоторые данные при публикации уведомлений, данные - это словарь, содержащий информацию о локальном уведомлении.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. Может ли кто-нибудь помочь найти решение? Благодарю.

enter image description here

решаемые по-другому, но до сих пор неясно, о причине утечки:

- (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' сохраняют друг друга?

+0

use stringWithFormat, а не stringWithString – Geet

+0

Вам нужно создать новую строку? 'copy' @Geet не использовать' stringWithFormat: ', если у вас на самом деле нет формата для обработки ... – Wain

+0

обрабатывает объект в строке, поэтому в этот момент вам нужно использовать stringWithFormat – Geet

ответ

0

Нужно перерабатывать userInfo. Вы можете просто передать его непосредственно.

Пока что Инструменты сообщают вам, что объект, созданный там, в конце концов просочился. Это означает, что кто-то, улавливающий PopReminder, вызывает утечку объекта. Исследуйте там. Хотя для вашего произвольного [NSString stringWithString:] существует нулевая потребность, это не является недопустимым.

Следующие:

- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification { 
    if ([UIApplication sharedApplication].applicationState == UIApplicationStateActive) { 
     [[NSNotificationCenter defaultCenter] 
     postNotificationName:@"PopReminder" 
     object:nil 
     userInfo:notification.userInfo]; 
    } 
} 

... является совершенной, полной версией методы вы предоставляете.

+0

Я также думаю, что это может быть неуместно с методом NSString, но есть что-то делать с получателем этого уведомления. Я исследую это. Благодарю. – yuying