• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

objective-c - 使类的实例在内存中停留更长时间(在 ARC 下)

[复制链接]
菜鸟教程小白 发表于 2022-12-13 10:09:59 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

我有一个 NSObject 类的实例,它应该解析 XML 并保存 NSManagedObjects,一切正常。但我需要在其中接收 NSManagedObjectContextDidSaveNotification 以合并 CoreData 上下文。

问题是我的实例在收到上述通知之前就被释放了。

如何防止我的实例被更快地释放?

这是我调用我的实例的时候

// in my ViewController implementation

WSNoticia *wsNoticia = [WSNoticia new]; // __strong by default right?

这是 WSNoticia 的实现:

- (id)init {
    self = [ super 初始化];
    如果( self ){
        [ self 解析新闻];
    }
    回归 self ;
}

- (无效)dealloc {
   //在 mergeChanges: 或 updateContext: 之前调用
}

#pragma mark - 私有(private)方法

- (void)parseNews {
   //将上下文保存在另一个线程中
    AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];

    NSManagedObjectContext *context = [[NSManagedObjectContext alloc] init];
    [上下文 setUndoManager:nil];//性能优势
    [上下文 setPersistentStoreCoordinator:[appDelegate persistentStoreCoordinator]];
    [[NSNotificationCenter defaultCenter] addObserver:self 选择器selector(mergeChanges name:NSManagedObjectContextDidSaveNotification object:context];

    NSBlockOperation *blockOperation = [NSBlockOperation blockOperationWithBlock:^{
    //取东西
    }];

    [blockOperation setCompletionBlock:^{
       //更新和保存东西
       //这里调用了 NSManagedObjectContextDidSaveNotification(通过 [context save:nil];
    }];

   //将操作添加到队列
    NSOperationQueue *operationQueue = [NSOperationQueue 新];
    [操作队列 addOperation:blockOperation];
}

//不会被调用
- (void)updateContextNSNotification *)notification {
    NSManagedObjectContext *mainContext = [self managedObjectContext];
    [mainContext mergeChangesFromContextDidSaveNotification:notification];

    [[NSNotificationCenter defaultCenter] postNotificationName:kNotificationNameNoticiasParsed object:self];
}

#pragma mark - NSNotificationCenter

//不会被调用
- (void)mergeChangesNSNotification *)notification {
    [[NSNotificationCenter defaultCenter] removeObserver:self];

    AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
    NSManagedObjectContext *mainContext = [appDelegate managedObjectContext];
    if ([通知对象] == mainContext) {
       //主上下文保存,无需执行合并
        返回;
    }
    [self performSelectorOnMainThreadselector(updateContext withObject:notification waitUntilDone:YES];
}



Best Answer-推荐答案


默认情况下会应用强生命周期限定符,但变量的生命周期仅适用于声明它的方法。

如果您将 wsNoticia 声明为实例变量,则应该没问题。

关于objective-c - 使类的实例在内存中停留更长时间(在 ARC 下),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8509715/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap