mirror of
https://github.com/klzgrad/naiveproxy.git
synced 2024-11-24 22:36:09 +03:00
70 lines
2.0 KiB
Plaintext
70 lines
2.0 KiB
Plaintext
// Copyright 2013 The Chromium Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style license that can be
|
|
// found in the LICENSE file.
|
|
|
|
#include "base/ios/weak_nsobject.h"
|
|
|
|
#include "base/mac/scoped_nsautorelease_pool.h"
|
|
#include "base/mac/scoped_nsobject.h"
|
|
|
|
namespace {
|
|
// The key needed by objc_setAssociatedObject.
|
|
char sentinelObserverKey_;
|
|
}
|
|
|
|
namespace base {
|
|
|
|
WeakContainer::WeakContainer(id object) : object_(object) {}
|
|
|
|
WeakContainer::~WeakContainer() {}
|
|
|
|
} // namespace base
|
|
|
|
@interface CRBWeakNSProtocolSentinel ()
|
|
// Container to notify on dealloc.
|
|
@property(readonly, assign) scoped_refptr<base::WeakContainer> container;
|
|
// Designed initializer.
|
|
- (id)initWithContainer:(scoped_refptr<base::WeakContainer>)container;
|
|
@end
|
|
|
|
@implementation CRBWeakNSProtocolSentinel
|
|
|
|
@synthesize container = container_;
|
|
|
|
+ (scoped_refptr<base::WeakContainer>)containerForObject:(id)object {
|
|
if (object == nil)
|
|
return nullptr;
|
|
// The autoreleasePool is needed here as the call to objc_getAssociatedObject
|
|
// returns an autoreleased object which is better released sooner than later.
|
|
base::mac::ScopedNSAutoreleasePool pool;
|
|
CRBWeakNSProtocolSentinel* sentinel =
|
|
objc_getAssociatedObject(object, &sentinelObserverKey_);
|
|
if (!sentinel) {
|
|
base::scoped_nsobject<CRBWeakNSProtocolSentinel> newSentinel(
|
|
[[CRBWeakNSProtocolSentinel alloc]
|
|
initWithContainer:new base::WeakContainer(object)]);
|
|
sentinel = newSentinel;
|
|
objc_setAssociatedObject(object, &sentinelObserverKey_, sentinel,
|
|
OBJC_ASSOCIATION_RETAIN);
|
|
// The retain count is 2. One retain is due to the alloc, the other to the
|
|
// association with the weak object.
|
|
DCHECK_EQ(2u, [sentinel retainCount]);
|
|
}
|
|
return [sentinel container];
|
|
}
|
|
|
|
- (id)initWithContainer:(scoped_refptr<base::WeakContainer>)container {
|
|
DCHECK(container.get());
|
|
self = [super init];
|
|
if (self)
|
|
container_ = container;
|
|
return self;
|
|
}
|
|
|
|
- (void)dealloc {
|
|
self.container->nullify();
|
|
[super dealloc];
|
|
}
|
|
|
|
@end
|