| // 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_ |