2010-06-04 49 views
0

嗨,大家好,我开始玩Objective-C,我想确保我的内存/属性正确。开始Objective-C,内存泄漏问题

假设以下代码:

@interface Rectangle : NSObject 
{ 
    Vector2* origin; 
    //[...] 
} 

Rectangle* myRect = [[Rectangle alloc] init]; 
myRect.origin.x = 100.0f; 
[myRect print]; 
myRect.origin = [[Vector2 alloc] init]; //hummm.. 2 concerns here. 

关注1:

假设原点标准(分配)中合成属性:

不myRect先前原点ref计数变为0自动当分配新的Vector2和GC后会照顾它?或者我必须在属性中明确地调用release?

关注2:

假设原点将是一个“保留”属性:(顺便说一句:希望声明一个合成保留属性时种代码被自动生成,是可能的?)

-(void) setOrigin: (Vector2*)newOrigin { 
    [newOrigin retain]; 
    [origin release] 
    origin = newOrigin; 
} 

myRect.origin = [[Vector2 alloc] init] 

会不会造成双重引用计数增量,那么需要relea:做的时候

然后se被称为两次以避免泄漏?当你使用库/其他人的代码来避免这样的问题时,你们是否依靠良好的文档编码(了解它是一个保留属性),还是有一些更安全的alloc/init对象?

感谢提示!

+0

只是为了澄清 - “原产地”应该是'Vector2 *'类型的,对吗? – 2010-06-04 06:45:15

+0

关于通过合成属性生成什么样的代码,您发布的内容是一个选项,并且是属性和垃圾回收之前使用的选项。还有其他的变化。而且,在原子属性中,这些语句会被某种互斥体括起来。 – JeremyP 2010-06-04 07:33:50

回答

4

关注1:
[...]请问myRect的上次的原点参考计数为0自动

没有,一个指派属性不正是它说 - 分配。它不保留也不释放 - 在这种情况下,您必须手动处理。

关注2:

myRect.origin = [[Vector2 alloc] init] 

会不会造成双重引用计数增量

是的,这就是为什么你会要么使用自动释放:

myRect.origin = [[[Vector2 alloc] init] autorelease]; 

...或手动释放:

Vector2 *v = [[Vector2 alloc] init]; 
myRect.origin = v; 
[v release]; 

至于如何处理这些问题:

  • 阅读memory management guide
  • 看看哪些文件或财产申报说
  • 传递给方法总是参数假设被调用方保留,如果需要的话 - 除非另有证明
+0

这个答案假定'origin'是对象类型。如果不是这样,那么这个问题和这个答案根本就没有任何意义,因为那些微妙和不幸的原因。如果是,那么快乐的一天...格奥尔格打败了我。 – bbum 2010-06-04 05:40:33

+0

对。既然你分配或保留了vector2,那么你必须释放它。像这样给myRect会导致myRect也保留它。 (然后,myRect将负责在它完成时释放它。) – 2010-06-04 05:46:17

+0

+1链接到可可内存管理 – JeremyP 2010-06-04 07:30:28