【问题标题】:Objective-C Passing address of non-local object to __autoreleasing parameterObjective-C 将非本地对象的地址传递给 __autoreleasing 参数
【发布时间】:2016-02-10 06:23:12
【问题描述】:

如何更改这行代码[NgnAVSession releaseSession: &audioSession];,以便不再出现此错误:

将非本地对象的地址传递给 __autoreleasing 参数 回写

这就是整个方法

- (void)viewWillDisappear:(BOOL)animated
{
    [NgnAVSession releaseSession: &audioSession];
    [UIDevice currentDevice].proximityMonitoringEnabled = NO;
}

这里是releaseSession的声明

标题

+(void) releaseSession: (NgnAVSession**) session;

实施

+(void) releaseSession: (NgnAVSession**) session{
        @synchronized (kSessions){
            if (session && *session){
                if([(*session) retainCount] == 1){
                    [kSessions removeObjectForKey:[*session getIdAsNumber]];
                }
                else {
                    [(*session) release];
                }
                *session = nil;
            }
        }
    }

【问题讨论】:

  • 我搜索了一些与我的错误相同的代码,但我不知道如何像他们那样编辑我的代码。
  • 好的先生,我又更新了。

标签: objective-c automatic-ref-counting


【解决方案1】:

您正在使用一个非常旧的库。尝试获取更新的版本。

然后阅读 Cocoa 如何使用 NSError*。你真的需要这样做,否则你不可能理解发生了什么。

长话短说:编译器假定您传递自动释放变量的地址。如果需要,它可以将局部变量转换为自动释放变量。这不能用非局部变量来完成。

这些家伙的所作所为是错误的,错误的,错误的,错误的,错误的。如果他们想在不计算引用的情况下跟踪所有会话,最简单的方法是创建一个包含弱引用的包装对象,将包装对象放入数组中,并在 dealloc 方法中从数组中删除对象。

我建议你扔掉他们的 releaseSession 并完全按照我之前所说的去做。

【讨论】:

  • 我希望我能得到一个更新的版本,但他们希望我使用它。我会尽量按照你说的做,但我需要先消化一下。我还不擅长 iOS 编程,所以我猜这对我来说可能很难。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-11-16
  • 2012-12-21
  • 2017-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-09
相关资源
最近更新 更多