Ranjeet Sajwan
Ranjeet Sajwan

Reputation: 1921

problems during object release

I have some problems during when and which object to be release

You can say my knowledge towards this is less

i have following conditions please suggest me the answer accordingly

NSMutableString *str=[[NSMutableString alloc]initWithFormat:@"Hello World!"];
NSMutableArray *array=[[NSMutableArray alloc]init];
[array addObject:str];

Now when i tried to release str then usage of array affected in future...and Vice Versa
Tell me can i release both?

NSMutableString *str=[[NSMutableString alloc]init]; str=@"Hello World !";
str=[self getData]; //calling a method which returns a string
[str release];

I think i am creating a memory leak here(how to solve it?)

please clear these situations

Upvotes: 0

Views: 62

Answers (2)

rajesh
rajesh

Reputation: 582

What is the need of creating the NSMutableString You can directly use NSString for this purpose

Upvotes: 0

Sam Ritchie
Sam Ritchie

Reputation: 11038

in the first situation, you'll need to call [str release]; after adding it to the array, like this:

NSMutableString *str = [[NSMutableString alloc] initWithString:@"Hello World!"];
NSMutableArray *array = [[NSMutableArray alloc] init];
[array addObject:str];
[str release];

This way, array holds the only retain call on the string. Once you release array later, you won't have any memory leak issues.

I'm a little confused about the second situation. str here is a pointer. You seem to be assigning three different objects to to same pointer:

NSMutableString *str = [[NSMutableString alloc] init]; //first object
str=@"Hello World !"; //second object
str=[self getData]; //third object

by the time you call [str release], you've created a memory leak because you've lost the first mutable string. The second time you called str =, you lost any way to access that first NSMutableString.

Assuming that you're looking to concatenate all of these (since you chose NSMutableString), you might try this:

NSMutableString *str = [[NSMutableString alloc] init]; //first object
[str appendString:@"Hello World!"];
[str appendString:[self getData]];
[str release];

If the [self getData] method returns an autoreleased string, you'll be fine. If getData returns a retained string (if you used alloc and init), you'll need to assign it to an intermediate pointer and release it after adding it to str.

Upvotes: 2

Related Questions