子类化委托问题

时间:2014-03-03 19:53:51

标签: ios iphone oop multiplayer mcsession

我在父类中创建一个MCSession:

- (void) setUpMultipeer{
    //  Setup peer ID
    self.myPeerID = [[MCPeerID alloc] initWithDisplayName:[UIDevice currentDevice].name];

    //  Setup session
    self.mySession = [[MCSession alloc] initWithPeer:self.myPeerID];
    self.mySession.delegate = self;

    //  Setup BrowserViewController
    self.browserVC = [[MCBrowserViewController alloc] initWithServiceType:@"chat" session:self.mySession];
    self.browserVC.delegate = self;

    //  Setup Advertiser
    self.advertiser = [[MCAdvertiserAssistant alloc] initWithServiceType:@"chat" discoveryInfo:nil session:self.mySession];
    [self.advertiser start];
}

我有两个子类,它们是父类的每个子类。我尝试记录每个子类中连接的对等体的数量,都返回0.此外,在记录self.mySession时,我得到了这个:

mySession:<MCSession: 0x15d7aae0 MyPeerID = <MCPeerID: 0x15d7b360 DisplayName = Eric's iPhone> SecurityIdentity = (null) EncryptionPreference = Optional ConnectedPeers = (
) Delegate = <ChildViewController: 0x15d867f0>>

我从未将代理设置为子代,但似乎认为MCSession代理已更改为子代,而不是留在父代。每个子视图控制器都说它是委托,我认为为了这个工作,每个孩子VC应该说父母是委托。我错过了什么?

另外:我正在使用故事板。 Child VC都是嵌入在NavigationController中的控制拖动推送segue。 NavController&gt;父母&gt;儿童1&amp;孩子2

1 个答案:

答案 0 :(得分:0)

子类创建对象并不意味着也会创建与超类的单独实例。您拥有 一个 对象 ChildViewControllerSuperViewController在同一时间。

执行上述代码时,self关键字引用ChildViewController的实际实例,同时也是SuperViewController的实例。

如果你在子类及其超类中记录self关键字,你会发现它们实际上指向了内存中的同一个对象。

P.S。你可以尝试po (SuperViewController *) [[self mySession] delegate],你会得到你期望的。