deimus
deimus

Reputation: 9893

ARC : Is this approach correct

This may sound a newbie question however I'm new to iOS dev.

I've following code in my project, the project is ARC enabled, and I get error on its execution (bad access), and would like to understand the cause of the problem and solve it.

on some button press following code is invoked in MTClassA.m file

-(void) someMethod
{
    for (int i = 0; i < N; i++) {
        ...
        (param1 and param2 are location variables)
        ... 
        mFlickr = [[MTFlickr alloc] initWithParam1:param1 param2:mparam2];
        mFlickr.delegate = self;
        [mFlickr fetchImages];
    }  
}

in MTClassA.h header file mFlickr is declared as MTFlickr* mFlickr so default it it with __strong qualifier.

the callback function of fetchImages class is following

- (void)didRecieveImageLinksFromFlickr:(NSArray*)response 
                                param1:(NSString*)param1 param2:(NSString*)param2 {
     ... 
}

So basically I would like to know is it correct to create mFlickr objects this way in for loop and expect the callback to work correctly, if no please suggest what need to be changed ?

P.S. Do I need to change mFlickr to local variable ? If yes how should I be guaranteed that param1 and param2 methods are the one's that I've passed for teach iteration in for loop ?

Upvotes: 2

Views: 218

Answers (3)

jrturton
jrturton

Reputation: 119292

You are creating multiple instances of the mFlickr object within your loop, and presumably assigning them to the same instance variable. Under ARC an assignment to an instance variable will automatically release the previous value, so your mFlickr objects are getting destroyed as soon as they are created (except the last one).

Presumably your mFlickr object is setting itself as a delegate for a URL request, it is probably this callback which is failing since the request's delegate no longer exists.

If you are creating multiple instances you should store them in an array instance variable. The callback should include a reference to the particular instance that has returned, and at this point, you remove it from the array.

Upvotes: 1

Krrish
Krrish

Reputation: 2256

Did you set @property for mFlicker?

.h
@property(nonatomic, retain) MTFlickr *mflicker;

.m
@synthesis mflicker;

I also had similar experience, ARC was releasing my object after initialization. so try changing your code to

self.mFlickr = [[MTFlickr alloc] initWithParam1:param1 param2:mparam2];
mFlickr.delegate = self;
[mFlickr fetchImages];

I am also not sure but i just wanted to provide some help

Upvotes: 0

Sunil Pandey
Sunil Pandey

Reputation: 7102

You don't need to change the mFLicker to local variable. The only thing that i found in your code wrong is that, you are immediately setting mFlicker to self after initializing it. i think you must want to set the delegate of the mFlicker that you can do it by

[mFlicker setDelegate:self]

Upvotes: 0

Related Questions