专注收集记录技术开发学习笔记、技术难点、解决方案
网站信息搜索 >> 请输入关键词:
您当前的位置: 首页 > Iphone

关于异步URLLoading代码的疑问解决办法

发布时间:2010-05-30 01:22:22 文章来源:www.iduyao.cn 采编人员:星星草
关于异步URLLoading代码的疑问
初学者,看着官方教程做的,成功也是成功了。但是有点疑问,请各位大神指教。
官方教程的代码:
C/C++ code

-(void)doProcess{
    NSString *urlString = @"https://api.weibo.com/2/statuses/public_timeline.json";
    NSURL *url=[[NSURL alloc]initWithString:urlString];
    NSMutableURLRequest  *request=[[NSMutableURLRequest alloc]init];
    [request setURL:url];
    NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
    if(connection)
    {
        receiveData = [[NSMutableData data] retain];
        NSLog(@"intial done!");
    }
    else
    {
        NSLog(@"sorry");
    }
}


问题1:
[[NSURLConnection alloc] initWithRequest:request delegate:self];这句话执行之后,应该是自动新开一个线程执行httprequest等操作,这里理应和主线程并行执行的。而假定doProcess函数是主线程的话,在if(connection)开始,另外一个线程已经在访问网络并下载数据了。而delegate中有对receiveData的操作。那么此时会不会出现receiveData还是nil的情况下就被下载线程使用的可能呢?

问题2:
为什么用receiveData = [[NSMutableData data] retain];而不是receiveData = [[NSMutableData alloc]init];呢?

------解决方案--------------------
问题1
多线程操作同一块数据,看你有没有做线程保护

问题2

NSMutableData 的类方法data直接可以取,只需要retain加1,保证到时正确回收,而每次 alloc 的话 开销很大啊
------解决方案--------------------
1.receiveData 是在你请求 connection 请求之后初始化的,而recv的delegate操作,是在你receive res之后,显然两者有明显的先后顺序,不可能有nil的可能。
2.receiveData 的初始化,receiveData = [[NSMutableData data] retain]是静态方法,系统会自动回收,而且alloc出来,是要手动释放掉。alloc的效果和retain的结果,其实是差不多的,retaincount也是相同的。至于ls说的,开销很大,receiveData只有被创建一次,没有开销很大的可能。我感觉。
友情提示:
信息收集于互联网,如果您发现错误或造成侵权,请及时通知本站更正或删除,具体联系方式见页面底部联系我们,谢谢。

其他相似内容:

热门推荐: