ARC:这种方法是否正确

时间:2012-03-19 07:22:34

标签: iphone objective-c automatic-ref-counting

这可能听起来像一个新手问题,但我是iOS开发新手。

我在项目中跟踪代码,项目启用了ARC,我的执行错误(访问不良),并希望了解问题的原因并解决它。

MTClassA.m文件

中调用某些按钮按下代码
-(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];
    }  
}
MTClassA.h头文件中的

mFlickr被声明为MTFlickr* mFlickr,因此默认使用__strong限定符。

fetchImages类的回调函数正在跟随

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

所以基本上我想知道在for循环中以这种方式创建mFlickr对象并期望回调正常工作是正确的,如果没有请建议需要更改的内容吗?

P.S。我需要将mFlickr更改为局部变量吗?如果是,我应该如何保证param1和param2方法是我在for循环中传递教学迭代的方法?

3 个答案:

答案 0 :(得分:1)

您正在循环中创建mFlickr对象的多个实例,并且可能将它们分配给同一个实例变量。在ARC下,对实例变量的赋值将自动释放先前的值,因此mFlickr对象一旦被创建就会被销毁(除了最后一个)。

大概你的mFlickr对象将自己设置为URL请求的委托,可能是这个回调失败了,因为请求的委托不再存在。

如果要创建多个实例,则应将它们存储在数组实例变量中。回调应该包含对已返回的特定实例的引用,并且在点,您将其从数组中删除。

答案 1 :(得分:0)

您无需将mFLicker更改为本地变量。我在你的代码中发现的唯一错误是你在初始化之后立即将mFlicker设置为self。我认为你必须要设置mFlicker的委托,你可以通过

来设置它
[mFlicker setDelegate:self]

答案 2 :(得分:0)

你为mFlicker设置了@property吗?

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

.m
@synthesis mflicker;

我也有类似的经历,ARC在初始化后释放我的对象。 所以尝试将代码更改为

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

我也不确定,但我只是想提供一些帮助