| Index: base/ios/weak_nsobject.mm
 | 
| diff --git a/base/ios/weak_nsobject.mm b/base/ios/weak_nsobject.mm
 | 
| new file mode 100644
 | 
| index 0000000000000000000000000000000000000000..36f9d3ea7cdd700da53d77a34245c3bad68a86c1
 | 
| --- /dev/null
 | 
| +++ b/base/ios/weak_nsobject.mm
 | 
| @@ -0,0 +1,61 @@
 | 
| +// 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_;
 | 
| +}
 | 
| +
 | 
| +@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
 | 
| 
 |