Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 在UIScrollView中添加带有循环的子视图会产生内存泄漏_Iphone_Objective C_Ipad_Ios5_Automatic Ref Counting - Fatal编程技术网

Iphone 在UIScrollView中添加带有循环的子视图会产生内存泄漏

Iphone 在UIScrollView中添加带有循环的子视图会产生内存泄漏,iphone,objective-c,ipad,ios5,automatic-ref-counting,Iphone,Objective C,Ipad,Ios5,Automatic Ref Counting,我是Objective-C的新手,我正在尝试做一个类似跳板的应用程序。所以我得到了一个UIScrollView,在其中我做了一个循环,从另一个UIViewController生成一系列子视图 这是我的密码: @implementation ProjectsListViewController { ProjectViewController *icon; } - int行=0; int列=0; int page=0; 对于(int i=0;i

我是Objective-C的新手,我正在尝试做一个类似跳板的应用程序。所以我得到了一个UIScrollView,在其中我做了一个循环,从另一个UIViewController生成一系列子视图

这是我的密码:

@implementation ProjectsListViewController {
    ProjectViewController *icon;
}
-

int行=0;
int列=0;
int page=0;
对于(int i=0;i<5;i++){
图标=[[ProjectViewController alloc]init];
icon.iconPath=@“icon.png”;
icon.iconTag=i;
INTX=(1024*页)+(50+(10*列)+(188*列));
int y=(40+(150*行));
icon.view.frame=CGRectMake(x,y,icon.view.frame.size.width,icon.view.frame.size.height);
[self.scrollView addSubview:icon.view];
//如果到达一页的末尾,请添加新页
如果((列==4)和&(行==3)){
行=0;
列=0;
page++;
//如果到达最后一列,请添加新行
}else if(列==4){
列=0;
行++;
//否则添加一列
}否则{
列++;
}
}
所有这些内容都包含在viewDidLoad方法中。如果我运行应用程序,一切正常,图标就会出现。 但是当我想点击一个图标时(按钮上有一个IBAction按钮可以推到另一个视图),我的应用程序可能会因为内存泄漏而崩溃。似乎不再引用子视图了

我找到的唯一解决方案是将每个ProjectViewController添加到NSMutableArray中。这样,我可以点击图标并推送另一个视图

有人能解释一下我做错了什么吗

对不起,如果你听上去不舒服,我正在努力学习


注意:我使用的是ARC。

如果图像绑定到和iAction,则应该使用UIButton而不是图像。这样,您就可以保持代码模块化,而不必担心管理两个不同对象和操作的内存

此外,您还应查看此问题的最后一个答案:

如果图像绑定到和iAction,则应使用UIButton而不是图像。这样,您就可以保持代码模块化,而不必担心管理两个不同对象和操作的内存

此外,您还应查看此问题的最后一个答案: 而不是:

icon = [[ProjectViewController alloc] init];
我会:

ProjectViewController *projectViewController = [[ProjectViewController alloc] init];
通过这种方式,每次通过循环创建一个新的ProjectViewController实例,另一种方式是每次通过重新分配相同的UIViewController。

而不是:

icon = [[ProjectViewController alloc] init];
我会:

ProjectViewController *projectViewController = [[ProjectViewController alloc] init];

通过这种方式,每次通过循环都会创建一个新的ProjectViewController实例,而通过另一种方式,每次都会重新分配相同的UIViewController。

如果没有引用循环外的图标类,则ARC将收集该图标类。这就是为什么将它们添加到列表中可以解决问题。您正在将图标的视图添加到列表中,以便它们最终被引用。但是没有任何东西可以跟踪图标本身

如果没有引用循环外的图标类,则ARC将收集该图标类。这就是为什么将它们添加到列表中可以解决问题。您正在将图标的视图添加到列表中,以便它们最终被引用。但是没有任何东西可以跟踪图标本身

Antoine你用数组做的解决方案是有效的,我会保持这样

在没有阵列的情况下洞察问题所在
•图标为ProjectViewController(正在动态创建并由ARC发布)
•将icon.view添加到任何视图都会导致该视图保留该图标
•当图标的动作被触发时,它试图向ProjectViewController实例发送不再有效的消息


使用您的数组(我假设它是属性(strong)),添加到数组中的每个ProjectViewController实例都不会被ARC释放,当您的图标动作被触发时,该方法将被发送到有效对象。

如果您使用数组制作的解决方案有效,我会保持这样

在没有阵列的情况下洞察问题所在
•图标为ProjectViewController(正在动态创建并由ARC发布)
•将icon.view添加到任何视图都会导致该视图保留该图标
•当图标的动作被触发时,它试图向ProjectViewController实例发送不再有效的消息


使用数组(我假设它是属性(strong)),ARC不会释放添加到数组中的每个ProjectViewController实例,当触发图标的操作时,该方法将发送到有效对象。

iAction是否链接到ProjectViewController?如果是这样,我认为这就是问题所在。另外,您的“我找到的唯一解决方案”有效吗?或者这是您目前唯一的想法吗?您需要提供堆栈跟踪。内存泄漏不是崩溃的原因(通常)我缺少每个图标的
addTarget
。你把它放在哪里?@Maudicus是的,我想每个图标都有一个小视图。我找到的解决方案是有效的,但由于我对Objective-C非常陌生,我不知道这是一种常见的做法还是一件非常丑陋的事情。@ott按钮是在Interface Builder中制作的,并链接到ProjectViewController中的iAction。iAction链接到ProjectViewController吗?如果是这样,我认为这就是问题所在。另外,您的“我找到的唯一解决方案”有效吗?或者这是您目前唯一的想法吗?您需要提供堆栈跟踪。内存泄漏不是崩溃的原因(通常)我缺少每个图标的
addTarget
。你把它放在哪里?@Maudicus是的,我想每个图标都有一个小视图。我找到的解决方案是有效的,但由于我对Objective-C非常陌生,我不知道这是一种常见的做法还是一件非常丑陋的事情。@ott按钮是在Interface Builder中制作的,并链接到ProjectViewController中的iAction。如果他们使用ARC,则无需调用release。哎哟,我没有看到这一点。对不起,我相应地更新了代码。谢谢你