开发者

Starting Objective-C, memory leak concerns

开发者 https://www.devze.com 2023-01-02 00:17 出处:网络
Hey guys, I\'m starting to play around with Objective-C and I want to make sure I get memory/properties right.

Hey guys, I'm starting to play around with Objective-C and I want to make sure I get memory/properties right.

Suppose the following code:

开发者_StackOverflow中文版
@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.

Concern 1:

Suppose origin is a standard (assign) synthesized property:

Does myRect's previous origin ref count goes to 0 automatically when assigning the new Vector2 and GC will take care of it later on? Or I have to call release explicitly inside the property?

Concern 2:

Suppose origin would be a 'retain' property: (BTW: Would that kind of code be automatically generated when declaring a synthesized retain property, is that possible?)

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

Then when doing:

myRect.origin = [[Vector2 alloc] init]

Wouldn't that cause a double ref count increment and then needing release to be called twice to avoid leak? Do you guys rely on well-documented code (to know it's a retain property) when using libraries/other people's code to avoid such problems, or is there some safer ways of alloc/init objects?

Thanks for tips!


Concern 1:
[...] Does myRect's previous origin ref count goes to 0 automatically

No, an assign property does just what it says - assign. It doesn't retain nor release - you have to handle that manually in that case.

Concern 2:

myRect.origin = [[Vector2 alloc] init]

Wouldn't that cause a double ref count increment

Yes, thats why you'd either use autorelease:

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

... or manually release it:

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

As for how to manage those problems:

  • read the memory management guide
  • look what the documentation or the property declaration says
  • for parameters passed to methods always assume the callee retains if needed - unless documented otherwise
0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号