| // Copyright 2016 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. |
| |
| #if defined(__has_feature) && __has_feature(objc_arc) |
| #error "ARC manages properties, so base::mac::ReleaseProperties isn't needed." |
| #endif |
| |
| #ifndef BASE_MAC_OBJC_RELEASE_PROPERTIES_H_ |
| #define BASE_MAC_OBJC_RELEASE_PROPERTIES_H_ |
| |
| #import <Foundation/Foundation.h> |
| |
| #include "base/base_export.h" |
| |
| // base::mac::ReleaseProperties(self) can be used in a class's -dealloc method |
| // to release all properties marked "retain" or "copy" and backed by instance |
| // variables. It only affects properties defined by the calling class, not |
| // sub/superclass properties. |
| // |
| // Example usage: |
| // |
| // @interface AllaysIBF : NSObject |
| // |
| // @property(retain, nonatomic) NSString* string; |
| // @property(copy, nonatomic) NSMutableDictionary* dictionary; |
| // @property(assign, nonatomic) IBFDelegate* delegate; |
| // |
| // @end // @interface AllaysIBF |
| // |
| // @implementation AllaysIBF |
| // |
| // - (void)dealloc { |
| // base::mac::ReleaseProperties(self); |
| // [super dealloc]; |
| // } |
| // |
| // @end // @implementation AllaysIBF |
| // |
| // self.string and self.dictionary will each be released, but self.delegate |
| // will not because it is marked "assign", not "retain" or "copy". |
| // |
| // Another approach would be to provide a base class to inherit from whose |
| // -dealloc walks the property lists of all subclasses to release their |
| // properties. Distant subclasses might not expect it and over-release their |
| // properties, so don't do that. |
| |
| namespace base { |
| namespace mac { |
| |
| namespace details { |
| |
| BASE_EXPORT void ReleaseProperties(id, Class); |
| |
| } // namespace details |
| |
| template <typename Self> |
| void ReleaseProperties(Self* self) { |
| details::ReleaseProperties(self, [Self class]); |
| } |
| |
| } // namespace mac |
| } // namespace base |
| |
| #endif // BASE_MAC_OBJC_RELEASE_PROPERTIES_H_ |