Objective-C 将非本地对象的地址传递给 __autoreleasing 参数

Objective-C Passing address of non-local object to __autoreleasing parameter

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

Passing address of non-local object to __autoreleasing parameter for write-back

这就是整个方法

- (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;
            }
        }
    }

您使用的是一个非常古老的库。尝试获取更新版本。

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

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

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

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