首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >iOS NSString stringWithString在使用ARC时会导致内存泄漏

iOS NSString stringWithString在使用ARC时会导致内存泄漏
EN

Stack Overflow用户
提问于 2015-11-04 12:09:42
回答 1查看 523关注 0票数 1

我想在发送通知时传递一些数据,数据是包含本地通知信息的字典。

代码语言:javascript
复制
- (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;

但是,在使用泄漏进行测试时,它会显示导致内存泄漏的NSString对象。一个类方法如何会导致内存泄漏,并且它正在使用ARC。有人能帮我找到解决办法吗?谢谢。

以另一种方式解决了问题,但仍不清楚泄漏的原因:

代码语言:javascript
复制
- (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‘会以何种方式相互保留呢?

EN

回答 1

Stack Overflow用户

发布于 2015-11-04 15:56:39

在传入的userInfo上不需要进行任何重新处理。你可以直接传下去。

与此同时,仪器正在告诉你,在那里创建的对象最终被泄露了。这意味着捕捉到PopReminder的人正在导致对象泄漏。在那里调查。尽管您的任意[NSString stringWithString:]没有任何需要,但它并不无效。

以下内容如下:

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

..。是您提供的方法的完美、完整版本。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33521534

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档