2014-12-03 48 views
1

我收到以下错误,但如何解决它?
错误被突出显示与绿色圆圈“引用计数对象用于它被释放之后”

被修改:我使用以下方法
如何解决“引用计数对象被释放后使用”的错误?

+ (NSString *)GetUUID 
{ 
    CFUUIDRef theUUID = CFUUIDCreate(NULL); 
    CFStringRef string = CFUUIDCreateString(NULL, theUUID); 
    CFRelease(theUUID); 
    NSString *str = (__bridge NSString *)string; 
    CFRelease(string); 
    return str; 
} 


编辑:已解决通过使用维杰的以下简单代码

NSUUID *UUID = [NSUUID UUID]; 
NSString* stringUUID = [UUID UUIDString]; 


enter image description here

回答

1

我希望,你得到,因为[DBManager GetUUID]方法,在那里你会释放CFRelease(cfUuid)此错误。

要获得UUID,试试这个简单的API

+ (NSString *)GetUUID 
{ 

    NSUUID *UUID = [NSUUID UUID]; 
    NSString* stringUUID = [UUID UUIDString]; 

    return stringUUID; 

} 
+0

那么,还是得到消息? – 2014-12-03 07:18:22

+0

是你使用像更新的答案? – 2014-12-03 07:25:27

+0

感谢vijay,我用简化的API替换了我的方法代码,然后它运行良好。 – 2014-12-03 07:34:56

0

CFUUIDCreateString后,你会得到你自己的字符串。通过使用__bridge,您可以将str设置为相同的字符串。所以,当你CFRelease(string)你没有自己的内存支持str了...

为了避免这种情况,要么喜欢@vijay说使用可可方法,或删除CFRelease和使用__bridge_transfer NSString*代替__bridge。这告诉编译器你正在将你拥有的CF对象转移到ARC世界中。

documentation

__bridge_transfer或CFBridgingRelease移动的非目标C指针Objective-C和也所有权转移给ARC。 ARC负责放弃对象的所有权 。

+0

感谢Thomas Deniau指出。我用vijay的代码取代了我的方法,现在它正在工作。 – 2014-12-03 07:34:17

相关问题