objective-c – 如何管理在辅助线程中运行的NSRunLoop的自动释放池?

objective-c – 如何管理在辅助线程中运行的NSRunLoop的自动释放池?,第1张

概述在Apple的 MVCNetworking示例代码中,NetworkManager类包含此方法以在专用于网络活动的辅助线程中维护运行循环(以便异步运行NSURLConnection): - (void)networkRunLoopThreadEntry{ while(YES) { NSAutoreleasePool *pool; pool = [[NSAu @H_301_4@ 在Apple的 MVCNetworking示例代码中,NetworkManager类包含此方法以在专用于网络活动的辅助线程中维护运行循环(以便异步运行NSURLConnection):

- (voID)networkRunLoopThreadEntry{    while(YES) {        NSautoreleasePool *pool;        pool = [[NSautorelease alloc] init];        [[NSRunLoop currentRunLoop] run];        [pool drain];    }}

如果没有源连接到运行循环,则run方法立即退出,这看起来像一个无限的while循环,如果当前没有NSURLConnection附加到运行循环,则无用地消耗cpu资源.

另一方面,为了使运行循环保持活动状态,some suggests在运行循环中调度空端口:

- (voID)networkRunLoopThreadEntry {     NSautoreleasePool *pool = [[NSautorelease alloc] init];     NSPort *port = [NSPort port];     [[NSRunLoop currentRunLoop] addPort:port forMode:NSRunLoopCommonModes];     [NSRunLoop run];     [pool drain]; }

但是,在这种情况下,我担心run方法永远不会退出,这意味着池永远不会被耗尽,这意味着在辅助线程中分配和自动释放的所有对象都将泄漏.

那是什么方式?

(对于上下文,和其他许多人一样,我正在尝试将异步NSURLConnection封装在NSOperation中,这意味着它可以在主线程之外触发.此外,MVCNetworking示例代码以及WWDC 2010会话网络应用程序对于iPhone OS,似乎建议有一个专用于网络传输的独特辅助线程以防止主线程上的延迟.)

@H_301_4@解决方法 您可以为kcfRunLoopBeforeWaiting活动创建一个 CFRunLoopObserver,并将其添加到运行循环中.在观察者的标注中,释放旧池并创建一个新池.未经测试的例子:

static voID resetPoolCallout(CFRunLoopObserverRef observer,CFRunLoopActivity activity,voID *info) {    NSautoreleasePool **poolPointer = (NSautoreleasePool **)info;    [*poolPointer release];    *poolPointer = [[NSautoreleasePool alloc] init];}- (voID)networkRunLoopThreadEntry {    NSautoreleasePool *pool = [[NSautoreleasePool alloc] init];    NSPort *port = [NSPort port];    [[NSRunLoop currentRunLoop] addPort:port forMode:NSRunLoopCommonModes];    CFRunLoopObserverContext observerContext = {        .version = 0,.info = (voID*)&pool,.retain = NulL,.release = NulL,.copyDescription = NulL    };    CFRunLoopObserverRef observer = CFRunLoopObserverCreate(NulL,kcfRunLoopBeforeWaiting,true,resetPoolCallout,&observerContext);    CFRunLoopAddobserver(CFRunLoopGetCurrent(),observer,kcfRunLoopCommonModes);    [[NSRunLoop currentRunLoop] run];    CFRunLoopRemoveObserver(CFRunLoopGetCurrent(),kcfRunLoopCommonModes);    CFRelease(observer);    [pool release];}
@H_301_4@ @H_301_4@ @H_301_4@ @H_301_4@ 总结

以上是内存溢出为你收集整理的objective-c – 如何管理在辅助线程中运行的NSRunLoop的自动释放池?全部内容,希望文章能够帮你解决objective-c – 如何管理在辅助线程中运行的NSRunLoop的自动释放池?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1003655.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-22
下一篇 2022-05-22

发表评论

登录后才能评论

评论列表(0条)

保存