// // GTMGarbageCollection.h // // Copyright 2007-2008 Google Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); you may not // use this file except in compliance with the License. You may obtain a copy // of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the // License for the specific language governing permissions and limitations under // the License. // #import #import "GTMDefines.h" // This allows us to easily move our code from GC to non GC. // They are no-ops unless we are require Leopard or above. // See // http://developer.apple.com/documentation/Cocoa/Conceptual/GarbageCollection/index.html // and // http://developer.apple.com/documentation/Cocoa/Conceptual/GarbageCollection/Articles/gcCoreFoundation.html#//apple_ref/doc/uid/TP40006687-SW1 // for details. #if (MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5) && !GTM_IPHONE_SDK // General use would be to call this through GTMCFAutorelease // but there may be a reason the you want to make something collectable // but not autoreleased, especially in pure GC code where you don't // want to bother with the nop autorelease. Done as a define instead of an // inline so that tools like Clang's scan-build don't report code as leaking. #define GTMNSMakeCollectable(cf) ((id)NSMakeCollectable(cf)) // GTMNSMakeUncollectable is for global maps, etc. that we don't // want released ever. You should still retain these in non-gc code. GTM_INLINE void GTMNSMakeUncollectable(id object) { [[NSGarbageCollector defaultCollector] disableCollectorForPointer:object]; } // Hopefully no code really needs this, but GTMIsGarbageCollectionEnabled is // a common way to check at runtime if GC is on. // There are some places where GC doesn't work w/ things w/in Apple's // frameworks, so this is here so GTM unittests and detect it, and not run // individual tests to work around bugs in Apple's frameworks. GTM_INLINE BOOL GTMIsGarbageCollectionEnabled(void) { return ([NSGarbageCollector defaultCollector] != nil); } #else #define GTMNSMakeCollectable(cf) ((id)(cf)) GTM_INLINE void GTMNSMakeUncollectable(id object) { } GTM_INLINE BOOL GTMIsGarbageCollectionEnabled(void) { return NO; } #endif // GTMCFAutorelease makes a CF object collectable in GC mode, or adds it // to the autorelease pool in non-GC mode. Either way it is taken care // of. Done as a define instead of an inline so that tools like Clang's // scan-build don't report code as leaking. #define GTMCFAutorelease(cf) ([GTMNSMakeCollectable(cf) autorelease])