任何人都可以向我解释下面的图片,我该如何在这段代码中发布
为什么当某些人有另一个对象而你正在发布时会出现问题,比如
NSURL *url = [NSURL URLWithString:@"some_url_having_image_on_server"];
NSData *data = [[NSData alloc] initWithContentsOfURL:url];
UIImage *image = [UIImage imageWithData:data];
我如何发布和解释案例,不要传递给我链接,只是用自己的编程技巧解释,我真的想清除一些内存管理的概念,它们让我疯狂: - (
提前致谢
答案 0 :(得分:3)
所有没有alloc的方法都是自动释放的。因此,[UIImage imagedWithData:]将在runloop结束时自动释放。
答案 1 :(得分:1)
使用alloc
,copy,
copyMutable and
new`的方法将返回保留计数为1的对象。
除非您明确保留,否则所有其他方法都应返回您不需要释放的自动释放对象。对于所有apple对象-c对象都是如此。
示例:
// need to be released:
NSString *temp = [[NSString alloc] init];
NSString *tempCopy = [temp copy];
NSString *newString [NSString new]; // which is the same are alloc, init.
[newstring release];
[tempCopy release];
[temp release];
自动释放的对象:
// You don not release:
NSString *temp = @"some string";
NSString *temp2 =[NSString string];
如果你真的想学习这些概念,那么你应该真正阅读这些概念:
答案 2 :(得分:0)
您是否尝试过:UIImage *img = [[UIImage alloc] initWithData:data];
并且可以随时发布。
编辑:
此外,如果您尝试在没有alloc方法的情况下释放创建的对象,您的应用程序将崩溃,因为您没有分配,并且您没有对内存说“这个地方是我的!”,那么您的应用程序将自动释放您的对象。
答案 3 :(得分:0)
Objective-C中的内存管理只有4条基本规则:
1.如果您拥有它,请将其释放。
2.如果您不拥有它,请不要将其释放。
3.在类中删除dealloc以释放您拥有的字段。
4.永远不要直接调用dealloc([super dealloc]
方法中对-dealloc
的调用除外)
如上所示,您有一个代码 UIImage * image = [UIImage imageWithData:data]; 在这里你没有分配任何东西,所以你没有权利释放它。
以上2点是最重要的。