9to5ios
9to5ios

Reputation: 5545

potential leak value stored never read in NSMutableArray

NOTE: i want to alloc my NSMutableArray and then assign data in it.

i got leak in below code

NSMutableArray *responseArr=[[NSMutableArray alloc]init];
                responseArr =[response valueForKey:@"result"];

Also in here value stored never read

 NSString *name=_txt_name.text;
    if ([name length]==0) {
        name=@"";
    }

Also leak in below

 NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setDateFormat:@"dd/MM/yyyy HH:mm:ss"];

    //below here i get leak 
    NSDate *dateStart = [[NSDate alloc] init];
    dateStart = [dateFormatter dateFromString:startDate];

EDIT :
I have disable ARC using -fno-objc-arc in reachability Class even i get below leaks

enter image description here

Upvotes: 0

Views: 86

Answers (2)

Paulw11
Paulw11

Reputation: 114974

This line

NSMutableArray *responseArr=[[NSMutableArray alloc]init];

Allocates a new NSMutableArray and assigns a reference to it to responseArr

This line

responseArr = [response valueForKey:@"result"];

Takes a value from a dictionary (that presumably is a reference to an NSMutableArray) and assigns that to responseArr. At this point there are no more references to the original NSMutableArray that you allocated, so it will be deallocated.

You can just say:

 NSMutableArray *responseArr = (NSMutableArray *)response[@"result"];

Similarly with your date code, you could just say:

NSDate *dateStart = [dateFormatter dateFromString:startDate];

There is no need to assign an initial value, only to throw it away.

None of the code you have shown will cause leaks, assuming you are using ARC.

If you aren't using ARC, then start using ARC!

Upvotes: 2

Amin Negm-Awad
Amin Negm-Awad

Reputation: 16660

A. First snippet

Using MRC (MRR) you have to balance allocations with +alloc your own:

NSMutableArray *responseArr = [[NSMutableArray alloc]init];
                responseArr = [response valueForKey:@"result"];

In the first line you allocate an instance of NSArray. You have to (auto-)release it later, otherwise it is a memory leak. I think you misunderstood that you create a new instance of NSArray using -valueForKey and assign the value of this new reference to responseArr. (Therefore you do not need a mutable array.) After that you created two objects having only one reference to the new one, you can never release the old one.

Do something like this:

NSArray *responseArr = [[NSArray alloc]init];
NSArray *resultArr =[response valueForKey:@"result"];
[responseArr release]; 

You do not have to do that with the object referred by resultArr, because it isn't created with +alloc-init. Here you get an introduction to ownership.

B. Third snippet

It is the same with the last example:

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];

You +alloc-init that instance object, but there is no release in your code. Therefore it cannot be released anymore, when the reference dateFormatter loses its extent (lifetime), i. e. returning from the method.

Add this code at the end of the method:

[dateFormatter release];

C. Second snippet

The second example has a different problem: You assign a value to the var name without using the variable in the code below. So assigning the value is meaningless.

Upvotes: 1

Related Questions