2016-09-28 85 views
0

我有一个对象incall的类。我有一个方法设置它,另一个方法运行该对象的方法。已设置实例变量nil

这里是我的头文件:

@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的代码。

+0

您正在将它设置为错误的实例。 – dasblinkenlight

+0

那么我该如何做到这一点呢? @dasblinkenlight – Ismailp

+0

你需要先展示你如何做不正确的方式。我的意思是,你调用setter的上下文,这个代表被调用的上下文。 – dasblinkenlight

回答

0

的一种方式会发生这种情况是你无论如何都RCTPlivo两个单独的实例。请尝试停止调试器在每个这些调用,并在调试器做:

(lldb) po self

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

0

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

更新

该属性被提及了作为代表所以其weak性质可以是一个指定行为,如果这是一个选项,消息发送者应当具有strong属性保持对象引用。

+0

@property(nonatomic,strong)PlivoIncoming * incall;是一个合适的解决方案 – Ismailp

+0

我有理由相信“强”是默认值。 – dasblinkenlight

+0

你是对的@dasblinkenlight – Ismailp

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 
+0

这没有用。 self.incall仍然为空。 – Ismailp

+0

所以a)其他的事情是把self.incall设置为零,在两个调用之间或者b)'incoming'是无开始的(你说它不是)。我没有看到其他选择。在ARC下,强指针无法将其自身设置为零。 – norders

+0

没有别的是将它设置为零,并且传入也不是零。我开始认为委托方法没有访问实例变量。情况会是这样吗? – Ismailp