遇到一些问题就先记录下来吧,以后回过头来看看。
#import <Foundation/Foundation.h>
#import "main.h"
int main(int argc, const char * argv[]) {
//自动释放池开始
@autoreleasepool {
NSLog(@"这是自动释放池,在这里面的操作结束后会自动释放");//不知道我的理解有没有错
}
//生成GUID
NSString* guid;
for(int i = 0; i < 100; i++){
guid = stringWithUUID();//获取GUID
NSLog(@"%d,%@", i, guid);//输出
}
return 0;
}
NSString* stringWithUUID(){
//create a new UUID
CFUUIDRef uuidObj = CFUUIDCreate(nil);//创建新的UUID对象
//get the string representation of the UUID
CFStringRef uuidstr = CFUUIDCreateString(nil, uuidObj);//UUID对象转字符
//NSString *restr =(NSString*)CFBridgingRelease(uuidstr);//CFBridgingRelease作用是啥
NSString *restr = (__bridge_transfer NSString *)uuidstr;//上面的现在改成这一句了
CFRelease(uuidObj);
//CFRelease(uuidstr);//关于是否释放这一块,目前我还没有理解,但是循环中如果加了这一句就奔溃,是啥问题呢?
return restr;
}
摆渡了一下,现在大概了解了可能是因为CFStringRef 到 NSString ARC泄漏。
相关类似问题:
解决方法:
事实上根据"标准"可可的命名约定,函数,包含 Create 或 Copy 在其名称中返回的对象的引用计数为 1。您必须将成弧土地转移此引用计数,所以那弧可以照顾它。您使用 __bridge_transfer 关键字用于此目的。
NSString *string = (__bridge_transfer NSString *)cfString;
NSString *strNS = @"";
CFStringRef strRef = (__bridge CFStringRef)strNS;
strNS = (__bridge NSString *)strRef;