如果我将CF类型转换为基础类型,我应该发送基础类型的发布消息吗?我应该将发布消息发送给已铸造对象吗?
NSString *name = (NSString*) rawName;
CFRelease(rawName);
//should I [name release]; ?
如果我将CF类型转换为基础类型,我应该发送基础类型的发布消息吗?我应该将发布消息发送给已铸造对象吗?
NSString *name = (NSString*) rawName;
CFRelease(rawName);
//should I [name release]; ?
不,不要发送另一个版本消息。这些是不同的参考到相同的对象。
通常,当混合使用Core Foundation方法和Cocoa方法时,无论您的基地是什么(所以如果您在Cocoa工作,请将其保留为NSString),并在需要使用其中一个其他框架的方法(例如将字符串传递给Core Foundation方法,只需将其转换为CFString,而不是保留多个引用)。
在这种情况下,* name和* rawName指向同一个对象。当您尝试使用名称时,CFRelease()的rawName将导致EXC_BAD_ACCESS。
因此,由于这些是对同一对象的不同引用,这是否意味着完成后释放其中一个引用就足够了? – Chiron 2010-11-07 21:39:43
是的,这正是它的意思。如果您想要长时间保持参考,则必须使用保留或复制消息来获取该参考的所有权,然后再发布。在您的示例中,一旦您在rawName上调用CFRelease(),就无法安全地访问rawName或name。 – 2010-11-07 21:59:07
在我的情况下,我将firstName添加到NSMutableArray,然后我是CFRelease rawName,我在做对吗? – Chiron 2010-11-07 22:11:39