Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 如何使用图像管理内存_Objective C_Memory Management_Alloc - Fatal编程技术网

Objective c 如何使用图像管理内存

Objective c 如何使用图像管理内存,objective-c,memory-management,alloc,Objective C,Memory Management,Alloc,好吧,如果我写了很多代码,却没有分配任何对象,那么内存会去哪里呢 例如,而不是 UIImage *myImage = [UIImage imageNamed:@"image.png"]; imageView.image = myImage; [myImage release]; 我有 在我所有的代码中。我看不出第二个例子中的内存发生了什么。我仍在学习,并在整个应用程序中使用第二个示例编写了大量代码,但从未分配任何对象。它在模拟器中总是运行良好,但实际设备无法处理内存并崩溃。所有关于内存管理的教

好吧,如果我写了很多代码,却没有分配任何对象,那么内存会去哪里呢

例如,而不是

UIImage *myImage = [UIImage imageNamed:@"image.png"];
imageView.image = myImage;
[myImage release];
我有

在我所有的代码中。我看不出第二个例子中的内存发生了什么。我仍在学习,并在整个应用程序中使用第二个示例编写了大量代码,但从未分配任何对象。它在模拟器中总是运行良好,但实际设备无法处理内存并崩溃。所有关于内存管理的教程都是从释放您创建的对象的角度来讨论它的,但由于我从未创建过任何对象,所以我被卡住了

UIImage *myImage = [UIImage imageNamed:@"image.png"];
imageView.image = myImage;
[myImage release];
你做了双重释放。[UIImage ImageName]是自动释放的,因此不需要显式释放对象。你的应用程序可能因为两次发布而崩溃,而不是因为未发布的对象

阅读简单的经验法则:

规则很简单:如果你分配、复制或保留,这是你的责任 释放的责任。如果你没有,那就不是了。然而,如果你 需要依靠一个物体停留在周围,你必须保留(和 随后发布)


更多示例:

imageView.image = [UIImage imageNamed:@"image.png"];
以上代码是有效的,您不必发布它。但如果您对未发布的对象(如此对象)使用大量直接指定:

foo.bar = [[SomeClass alloc] initWithSomething:@"Init"];
您只需添加自动释放即可轻松修复这些问题:

foo.bar = [[SomeClass alloc] initWithSomething:@"Init"] autorelease];
或者,如果您想要一种较长但可能更合适的方式(因为您控制了对象的释放时间):


您将声明变量与分配内存/对象混为一谈。在上述两种情况下,代码的重要部分实际上是:

[UIImage imageNamed:@"image.png"];
这段代码碰巧调用了UIImage类上的一个类方法,该类方法执行了许多操作。其中之一是UIImage对象的分配和初始化。在第一个示例中,您将此分配的对象存储到名为
myImage
的变量中。然后,您将闪亮的新对象移动到另一个(类)变量“imageView.image”中

UIImage *myImage = ...
在您给出的第二个示例中,您仍然将此分配的对象存储在变量中,但在本例中,您跳过了中间赋值并将对象直接存储到类变量
imageView.image

imageView.image = [UIImage imageNamed:@"image.png"];
考虑变量与对象的一种方法是将它们与房屋进行比较。在这个场景中,一个变量是你的地址,对象是你的房子。有几个人可以知道你的地址,但不管他们有多少人,当他们选择访问时,他们都会去同一所房子。因此,在您的示例中,
myImage
imageView.image
是指向同一房屋或对象的地址,UIImage的一个实例。在您的示例中,您实际上不需要创建中间变量,除非您将其用于其他目的

至于车祸,你应该仔细阅读。这可能需要一段时间,但你会习惯苹果在保留和释放对象方面遵循的标准。请注意,XCode 4.2中的新自动参考计数 缓解了许多这些问题,但它也有自己的学习曲线。但总而言之,您正在崩溃,因为您正在释放一个您不拥有的对象。UIImage上的class方法
imageNamed
返回该类的自动发布实例。您不需要在代码中向它发送另一个版本,这可能是程序崩溃的原因

imageView.image = [UIImage imageNamed:@"image.png"];
这句话很棒,也很正确

imageNamed:
方法的实现中,它可以为新的
UIImage
分配内存,将新的
UIImage
实例化到该内存中,然后在返回它之前将其自动释放。自动释放池在代码运行后耗尽,如果没有任何东西保留图像对象,则释放图像对象

那么“记忆去了哪里?”。它将进入自动释放池。但实际上,除非你调用
alloc
copy…
retain
,否则你不必在意

正如Manny所指出的,您的第一个代码片段没有过度发布,是不正确的

imageView.image = [UIImage imageNamed:@"image.png"];
imageView.image = [UIImage imageNamed:@"image.png"];