这可能听起来像一个新手问题,但我是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循环中传递教学迭代的方法?
答案 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];
我也不确定,但我只是想提供一些帮助