mirror of
https://github.com/klzgrad/naiveproxy.git
synced 2024-11-28 08:16:09 +03:00
66 lines
1.9 KiB
C
66 lines
1.9 KiB
C
|
// 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_
|