0

我正在使用“WCSession”来连接我的应用程序和 Apple Watch。我更喜欢单例方法。所以,我做了一个共享会话:

static Shared_WCSession *sharedInstance = nil;
+(Shared_WCSession*)getSharedInstance {
    @synchronized(self) {
        // If the class variable holding the reference to the single ContentManager object is empty create it.
        if(sharedInstance == nil) {
             sharedInstance = [[Shared_WCSession alloc] init];
        }
    }
     return sharedInstance;
}

然后在开始会话中,我为会话设置了代表:

-(void)startSession {
     if ([WCSession isSupported]) {
        self.session = [WCSession defaultSession];
        self.session.delegate = self;
        [self.session activateSession];
        LOG(@"WCSession is supported");
    }
}

解除分配委托的正确方法是什么?

根据苹果的文档,我可以通过以下方法做到这一点:

sessionDidBecomeInactive(_:) 
sessionDidDeactivate(_:)

如果我将委托设置为零,这会干扰我的应用程序的性能吗?

4

2 回答 2

1

首先,我想知道 self.session 遵循弧线,并且由于委托始终包含弱引用,因此无需将其设置为 nil。

它会引起任何问题吗?如果你没有手动设置它 nil ?如果是,那么您可以将其设置为 nil insessionDidDeactivate如它所说:Called after all data from the previous session has been delivered and communication with the Apple Watch has ended. 并且您可以设置新会话,例如

func sessionDidDeactivate(session: WCSession) {
    // Begin the activation process for the new Apple Watch.
    WCSession.defaultSession().activateSession()
}
于 2019-08-01T09:10:32.360 回答
0

WCSession.delegate 不会泄漏:它是一个弱引用

NS_CLASS_AVAILABLE_IOS(9.0)
@interface WCSession : NSObject
// ...
/** A delegate must exist before the session will allow sends. */
@property (nonatomic, weak, nullable) id <WCSessionDelegate> delegate;
// ...

如果您正在使用 ARC 并且您的委托仍在内存中,这不是因为 WCSession.delegate

于 2019-08-01T17:18:05.750 回答