将 WCSession 的委托设置为 nil

setting delegate of WCSession to nil

我正在使用 '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");
    }
}

取消分配委托的正确方法是什么?

根据apple's docs我可以通过以下方法来完成:

sessionDidBecomeInactive(_:) 
sessionDidDeactivate(_:)

如果我将委托设置为 nil,这会影响我的应用程序的性能吗?

首先我想知道self.session是跟在arc后面的,因为delegate总是包含weak reference所以没必要设置为nil。

它是否引起任何问题?如果你没有手动设置它 nil ?如果是,那么你可以在 sessionDidDeactivate 中将它设置为 nil,正如它所说: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()
}

WCSession.delegate不会漏:it is a weak reference

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