设置后的实例变量为nil

时间:2016-09-28 11:07:58

标签: ios objective-c

我有一个对象incall的类。我有一个设置它的方法和另一个运行该对象可用方法的方法。

这是我的头文件:

@interface RCTPlivo : NSObject <PlivoEndpointDelegate, CXProviderDelegate>

@property (nonatomic) PlivoIncoming *incall;

@property (nonatomic) PlivoEndpoint *endpoint;

@end

这是我的实施文件:

@implementation RCTPlivo

- (void)login {
    endpoint = [[PlivoEndpoint alloc] init];
    [endpoint login:plivoUser AndPassword:plivoPass];
    endpoint.delegate = self;
}

- (void)triggerIncomingCall {

    ...

    CXProvider *callkitProvider = [[CXProvider alloc] initWithConfiguration: configuration];
    [callkitProvider setDelegate:self queue:nil];

    ...

    [callkitProvider reportNewIncomingCallWithUUID:currentCall  update:update completion:^(NSError * _Nullable error) {
        if (error) {
            NSLog(@"Error: %@", error);
        }
    }];
}

- (void)onIncomingCall:(PlivoIncoming *)incoming {
    // setting 
    self.incall = incoming
}

- (void)provider:(CXProvider *)provider performAnswerCallAction:(CXAnswerCallAction *)action
{
    // Here self.incall is null
    [self.incall answer];
}

@end

当我在perfromAnswerCall委托self.incall委托时,它为空。当我在onIncomingCall委托中记录它时,变量被设置。

我在这里缺少什么?

更新 添加了初始化代理并删除了ivars的代码。

3 个答案:

答案 0 :(得分:1)

您的界面应该是:

@interface RCTPlivo : NSObject <PlivoEndpointDelegate>

@property (nonatomic, strong) PlivoIncoming *incall;

@end

您的实施应该是:

@implementation RCTPlivo

- (void)onIncomingCall:(PlivoIncoming *)incoming {
    self.incall = incoming;
}

- (void)provider:(CXProvider *)provider performAnswerCallAction:(CXAnswerCallAction *)action {
    [self.incall answer];
}

@end

答案 1 :(得分:0)

infall属性未定义为strong。因此,我们可以假设在此方法之外没有strong对原始对象的引用,并且它已被释放。

<强>更新

此属性被称为委托,因此其weak性质可以是指定行为,如果这是一个选项,则消息发送方应具有保存对象的strong属性参考

答案 2 :(得分:0)

这种情况的一种方式是你以某种方式拥有两个独立的RCTPlivo实例。尝试在每个调用中停止调试器,并在调试器中执行:

(lldb) po self

如果一切正常,那么地址应该是相同的。