将 WCSession 的委托设置为 nil

Posted

技术标签:

【中文标题】将 WCSession 的委托设置为 nil【英文标题】:setting delegate of WCSession to nil 【发布时间】:2019-07-29 15:12:01 【问题描述】:

我正在使用“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,这会影响我的应用程序的性能吗?

【问题讨论】:

【参考方案1】:

首先我想知道 self.session 是跟随 arc 的,并且由于委托总是包含弱引用,所以不需要将其设置为 nil。

它会导致任何问题吗?如果你没有手动设置它 nil ?如果是,那么您可以在sessionDidDeactivate 中将其设置为零,因为它说: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()

【讨论】:

是的,我正在使用 ARC。但是这个委托有两个问题:首先它会导致内存泄漏。其次,有时我的会议管理不顺利。就像我有 2 个苹果手表一样,第二个似乎已连接,但它没有收到任何数据。 @taratandel,我想你得到了答案 :) 正如我在回答中提到的那样,弱参考对你有用,就像@property (nonatomic, weak, nullable) id <WCSessionDelegate> delegate;【参考方案2】:

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

【讨论】:

以上是关于将 WCSession 的委托设置为 nil的主要内容,如果未能解决你的问题,请参考以下文章

WCSession 只工作一次

如何将委托设置为零?

如何将另一个 ViewController 设置为 AlertView 的委托

将委托设置为视图控制器时 UITextField 停止工作

在 Apple Watch 和 iPhone 之间使用 WCSession 共享数据

session.isReachable 在 watchos 的背景中总是假的