forked from chromium/chromium
-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathobjc_release_properties.h
65 lines (53 loc) · 1.89 KB
/
objc_release_properties.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
// 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_