1 /* 2 * Copyright (C) 2004 Apple Computer, Inc. All rights reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions 6 * are met: 7 * 1. Redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer. 9 * 2. Redistributions in binary form must reproduce the above copyright 10 * notice, this list of conditions and the following disclaimer in the 11 * documentation and/or other materials provided with the distribution. 12 * 13 * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY 14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR 17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24 */ 25 26 #import <CoreFoundation/CFBase.h> 27 #import <Foundation/NSObject.h> 28 29 // nil-checked CFRetain/CFRelease covers for Objective-C ids 30 31 // Use CFRetain, CFRelease, HardRetain, or HardRelease instead of 32 // -[NSObject retain] and -[NSObject release] if you want to store 33 // a pointer to an Objective-C object into memory that won't 34 // be scanned for GC, like a C++ object. 35 36 static inline id HardRetain(id obj) 37 { 38 if (obj) CFRetain(obj); 39 return obj; 40 } 41 42 static inline void HardRelease(id obj) 43 { 44 if (obj) CFRelease(obj); 45 } 46 47 // As if CF and Foundation had logically separate reference counts, 48 // this function first increments the CF retain count, and then 49 // decrements the NS retain count. This is needed to handle cases where 50 // -retain/-release aren't equivalent to CFRetain/HardRelease, such as 51 // when GC is used. 52 53 // Use HardRetainWithNSRelease after allocating and initializing a NSObject 54 // if you want to store a pointer to that object into memory that won't 55 // be scanned for GC, like a C++ object. 56 57 static inline id HardRetainWithNSRelease(id obj) 58 { 59 HardRetain(obj); 60 [obj release]; 61 return obj; 62 } 63 64 // Use HardAutorelease to return an object made by a CoreFoundation 65 // "create" or "copy" function as an autoreleased and garbage collected 66 // object. CF objects need to be "made collectable" for autorelease to work 67 // properly under GC. 68 69 static inline id HardAutorelease(CFTypeRef obj) 70 { 71 if (obj) 72 CFMakeCollectable(obj); 73 [(id)obj autorelease]; 74 return (id)obj; 75 } 76