使用GCD时的内存管理问题

对于dispatch_queue_t 对象来说,我们应该这么写
#if OS_OBJECT_USE_OBJC
@property (strongnonatomicdispatch_queue_t barrierQueue;
#else
@property (assignnonatomic) dispatch_queue_t barrierQueue;
#endif
在dealloc方法中应该加上
#if !OS_OBJECT_USE_OBJC   //这个宏是在sdk6.0之后才有的,如果是之前的,OS_OBJECT_USE_OBJC0
    dispatch_release(_barrierQueue);
#endif
当然了,也可以使用
#if __IPHONE_OS_VERSION_MIN_REQUIRED < 60000 // 6.0sdk之前
    dispatch_release(_barrierQueue);
#endif
这里的宏  __IPHONE_OS_VERSION_MIN_REQUIRED  就是我们在工程的设置项里设置的最低部署sdk版本


原因就是  对于最低sdk版本>=ios6.0来说,GCD对象已经纳入了ARC的管理范围,我们就不需要再手工调用 dispatch_release了,否则的话,在sdk<6.0的时候,即使我们开启了ARC,这个宏OS_OBJECT_USE_OBJC 也是没有的,也就是说这个时候,GCD对象还必须得自己管理

如果你部署的最低目标低于 iOS 6.0 or Mac OS X 10.8
你应该自己管理GCD对象,使用(dispatch_retain,dispatch_release),ARC并不会去管理它们

如果你部署的最低目标是 iOS 6.0 or Mac OS X 10.8 或者更高的
ARC已经能够管理GCD对象了,这时候,GCD对象就如同普通的OC对象一样,不应该使用dispatch_retain ordispatch_release 

内存管理问题,,,

03-19

小弟以前是搞过.net和java,从来没关心什么内存溢出问题,最近因为需要,接触了objective-c ,被这个问题搞得好晕,不知道啥时候该 retain,啥时候该release。反正加上这些,程序就挂掉。。请个位大侠指点下,比如下面这段代码,被注释掉得地方是我认为该加的retain或release的地方,但是实际并不是这样。能不能给我解释一下呢?小弟在这里拜谢了。。。代码可能写得很烂,习惯了.net,不知道哪些该注意,请大家耐着性子看。。。rn[code=C/C++]-(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationTypernrn NSString *urlString = [[request URL] absoluteString];rn if ([urlString hasPrefix:@"cmd:"]) rn NSRange range = [urlString rangeOfString:@"?"];//这种非指针类型不需要释放么?rn NSString *cmd = [[urlString substringToIndex:range.location] substringFromIndex:4];//为什么在最后release这个变量时也会挂掉?rn NSString *paramsString = [urlString substringFromIndex:range.location+range.length];rn NSArray *params = [paramsString componentsSeparatedByString:@"&"];rn if ([cmd caseInsensitiveCompare:@"changeLocation"] == NSOrderedSame) rn NSString *lat,*lng;rn for (NSObject *item in params) rn NSString *param = (NSString *)item;rn range = [param rangeOfString:@"="];rn NSString *name = [param substringToIndex:range.location];rn NSString *value = [param substringFromIndex:range.location + 1];rn if ([name caseInsensitiveCompare:@"lat"]== NSOrderedSame) rn lat = value;rn //[lat retain];rn else if ([name caseInsensitiveCompare:@"lng"] == NSOrderedSame) rn lng = value;rn //[lng retain];rn rn //[name release];rn //[value release];rn //[param release];rn rn [coordinate setText:[NSString stringWithFormat:@"当前纬度为:%@经度为:%@",lat,lng]];rn //[lat release];rn //[lng release];rn rn //[cmd release];rn //[paramsString release];rn //[params release];rn rn return YES;rn[/code]rnrn[img=http://hi.csdn.net/attachment/201203/19/4915695_1332138741vZL0.png][/img] 论坛

没有更多推荐了,返回首页