菜鸟教程小白 发表于 2022-12-13 10:09:59

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


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

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

<p>如何防止我的实例被更快地释放?</p>

<p>这是我调用我的实例的时候</p>

<pre><code>// in my ViewController implementation

WSNoticia *wsNoticia = ; // __strong by default right?
</code></pre>

<p>这是 WSNoticia 的实现:</p>

<p><code></code></p><code>

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

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

#pragma mark - 私有(private)方法

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

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

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

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

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

//不会被调用
- (void)updateContext:(NSNotification *)notification {
    NSManagedObjectContext *mainContext = ;
    ;

    [ postNotificationName:kNotificationNameNoticiasParsed object:self];
}

#pragma mark - NSNotificationCenter

//不会被调用
- (void)mergeChanges:(NSNotification *)notification {
    [ removeObserver:self];

    AppDelegate *appDelegate = (AppDelegate *)[ delegate];
    NSManagedObjectContext *mainContext = ;
    if ([通知对象] == mainContext) {
       //主上下文保存,无需执行合并
      返回;
    }
    ;
}
</code></pre>

</code><p><code></code></p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>默认情况下会应用强生命周期限定符,但变量的生命周期仅适用于声明它的方法。 </p>

<p>如果您将 wsNoticia 声明为实例变量,则应该没问题。 </p></p>
                                   
                                                <p style="font-size: 20px;">关于objective-c - 使类的实例在内存中停留更长时间(在 ARC 下),我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/8509715/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/8509715/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: objective-c - 使类的实例在内存中停留更长时间(在 ARC 下)