Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/113.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 iOS:Properties–;分配和释放对象_Objective C_Ios_Memory Management_Memory Leaks_Properties - Fatal编程技术网

Objective c iOS:Properties–;分配和释放对象

Objective c iOS:Properties–;分配和释放对象,objective-c,ios,memory-management,memory-leaks,properties,Objective C,Ios,Memory Management,Memory Leaks,Properties,在iOS(4)中,我很难在一个作用域中分配对象,然后在另一个作用域中释放它。我使用属性作为指向对象的指针。对象在一个实例类方法中分配和初始化,我在类的dealloc方法中释放它。属性是用retain声明的。除了使用像这样的属性有问题之外,我还发现分配、初始化对象和设置属性很麻烦 NSObject *object = [[NSObject alloc] init]; Self.myProperty = object; [object release]; 我试过了 self.myObject =

在iOS(4)中,我很难在一个作用域中分配对象,然后在另一个作用域中释放它。我使用属性作为指向对象的指针。对象在一个实例类方法中分配和初始化,我在类的dealloc方法中释放它。属性是用retain声明的。除了使用像这样的属性有问题之外,我还发现分配、初始化对象和设置属性很麻烦

NSObject *object = [[NSObject alloc] init];
Self.myProperty = object;
[object release];
我试过了

self.myObject = [[NSObject alloc] init];
然而,这给了我一个内存泄漏

我的问题:我必须制作这个临时对象,还是有更优雅的方式来制作它?

[self setMyProperty:nil], [myProperty release];
后续问题:我是否必须将属性设置为nil并释放自动生成的ivar?

[self setMyProperty:nil], [myProperty release];
当XCode 4为您生成属性存根时,它会将[self-setMyProperty:nil]放在viewDidUnload中,[\u-myProperty-release]放在dealloc中

第一个问题:

autorelease
是您的朋友:

self.myObject = [[[NSObject alloc] init] autorelease];
第二个问题:

不,这是多余的,但无害,因为第二次操作将不起任何作用(
[nil release]
是安全的)。
我建议使用
self.XXX=nil构造,因为它更安全、更清晰/可读。

自我。表示法在执行retain的合成setter中运行,这就是为什么需要在init对象上执行自动释放。相反,你可以离开自我。只要使用

myObject = [[NSObject alloc] init;
这一行只是将myObject指针设置为保留对象,不会有任何泄漏

这是我不久前提出的问题,与你的问题相同:


没有必要将赋值为nil。这意味着我应该只释放IVAR而忽略属性?我并不是有意怀有敌意或其他什么;这只是苹果处理属性的方式对我来说有点奇怪。试图找出如何用iOS方式处理属性。我一直在考虑同样的问题。然而,据我所知,苹果在其文档中鼓励您使用属性。在我的书中,如果你使用属性,你就不会碰IVAR。如果绕过setter,属性有什么意义?这正是让我困惑的地方。这不符合我以前的认知模式。谢谢,我会尝试一下自动释放。在为iPhone编程时,我读了很多帖子,警告不要使用自动释放。太多了,我几乎忘了它的存在。这可能就在这里,可以使用它。第二个答案,我想是的。测试自动释放,没有泄漏。我选择这个,它是最适合我在另一个世界中使用属性的一个。请确保在指定nil之前完成发布!如果先指定nil,则释放将转到nil对象,而不是需要释放的对象。@Dancreek:不正确。如果您执行
self.property=nil如果对成员变量调用release。