关于实例变量声明的位置

lawlite9 2014-07-14 04:40:57
加精
这是我按照《iOS7 by Tutorials》码的代码,就是实现一个灰色的矩形下落到屏幕低端的小功能

对于那三个实例变量animator,gravity,collision声明的位置,我一开始放在viewdidload方法里的,但是运行后只是简单的显示指定尺寸的灰色矩形,并没有下落,但当我把这三个变量放到如图的位置或者viewcontroller.h的接口声明里时,又可以如期运行,我很好奇为什么那个实例变量square放在viewdidload方法里是可以正常工作的,那几个却不可以。想不透,求指点迷津。
...全文
1173 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
lawlite9 2014-07-23
  • 打赏
  • 举报
回复
引用 6 楼 virtualxmars 的回复:
声明在viewDidLoad中的话,如果viewDidLoad执行完毕,ARC条件下,编译器会自动插入release的调用,这样,它们就被释放了。所以后面的动画也就木有了。 但是如果放在@implementation后面,它们都是实例变量,在viewDidLoad中定义实例对象,并赋值给这些实例时,viewController就保留(retain)了它们,也就是说,viewDidLoad之后,它们还是存在的,这样后面的动画就得以执行。 要再讲得深一点的话,动画的执行并不是在viewDidLoad中发生的,而只是定义了一些动画行为,而实际动画的执行是在后续的事件循环中产生的。即使在viewDidLoad中声明、定义了动画,但是紧接着由于对象被release,那么动画也就会被执行了。
但是之后在viewDidLoad里有如下:UIDynamicItemBehavior *=itemBehavior = [[UIDynamicItemBehavior alloc] initWithItems:@[square]]; itemBehavior.elasticity =0.6; [_ainmator addBehavior:itemBehavior];代码,照理说itemBehavior应该也会被release,为什么还是能如期运行?
my03131302 2014-07-23
  • 打赏
  • 举报
回复
virtualxmars 2014-07-21
  • 打赏
  • 举报
回复
另外回答那个square的问题,因为有这么一行代码: [self.view addSubView:square]; 所以square实际上被self.view进行了retain操作。所以,即使viewDidLoad中对其进行了release,但square对象仍然是‘存在’的,不受影响。
virtualxmars 2014-07-21
  • 打赏
  • 举报
回复
声明在viewDidLoad中的话,如果viewDidLoad执行完毕,ARC条件下,编译器会自动插入release的调用,这样,它们就被释放了。所以后面的动画也就木有了。 但是如果放在@implementation后面,它们都是实例变量,在viewDidLoad中定义实例对象,并赋值给这些实例时,viewController就保留(retain)了它们,也就是说,viewDidLoad之后,它们还是存在的,这样后面的动画就得以执行。 要再讲得深一点的话,动画的执行并不是在viewDidLoad中发生的,而只是定义了一些动画行为,而实际动画的执行是在后续的事件循环中产生的。即使在viewDidLoad中声明、定义了动画,但是紧接着由于对象被release,那么动画也就会被执行了。
lawlite9 2014-07-20
  • 打赏
  • 举报
回复
引用 4 楼 disburden 的回复:
楼主想问的应该是animator,gravity,collision这个3个变量声明的位置造成的影响 你的代码已经全部贴出来了吗?后面应该还有吧 我估计是变量作用域的问题,如果你在viewdidload方法里声明变量,这表明这些变量的作用域就只能在viewdidload方法里,出了这个方法就无效了,如果声明在顶部或者接口那,就表明这些变量在这个类里面都有效,我认为你后面应该还有些代码用到这些变量吧
我的意思就是为什么这三个变量的生命放到viewdidload方法里就无法实现那些重力,碰撞的动画了,明明这些动作我都是在viewdidload里定义的
不担心 2014-07-17
  • 打赏
  • 举报
回复
楼主想问的应该是animator,gravity,collision这个3个变量声明的位置造成的影响 你的代码已经全部贴出来了吗?后面应该还有吧 我估计是变量作用域的问题,如果你在viewdidload方法里声明变量,这表明这些变量的作用域就只能在viewdidload方法里,出了这个方法就无效了,如果声明在顶部或者接口那,就表明这些变量在这个类里面都有效,我认为你后面应该还有些代码用到这些变量吧
LichKingSZ 2014-07-16
  • 打赏
  • 举报
回复
它 = viewdidload
lawlite9 2014-07-14
  • 打赏
  • 举报
回复
引用 1 楼 sinom 的回复:
[quote=引用 楼主 u012340887 的回复:] 这是我按照《iOS7 by Tutorials》码的代码,就是实现一个灰色的矩形下落到屏幕低端的小功能 对于那三个实例变量animator,gravity,collision声明的位置,我一开始放在viewdidload方法里的,但是运行后只是简单的显示指定尺寸的灰色矩形,并没有下落,但当我把这三个变量放到如图的位置或者viewcontroller.h的接口声明里时,又可以如期运行,我很好奇为什么那个实例变量square放在viewdidload方法里是可以正常工作的,那几个却不可以。想不透,求指点迷津。
你图里的就是“ viewdidload”方法。为什么它可以别的不行是因为到它这里才表示View加载完成,才可以开始做动画。[/quote] 两个它分别是指?
LichKingSZ 2014-07-14
  • 打赏
  • 举报
回复
引用 楼主 u012340887 的回复:
这是我按照《iOS7 by Tutorials》码的代码,就是实现一个灰色的矩形下落到屏幕低端的小功能 对于那三个实例变量animator,gravity,collision声明的位置,我一开始放在viewdidload方法里的,但是运行后只是简单的显示指定尺寸的灰色矩形,并没有下落,但当我把这三个变量放到如图的位置或者viewcontroller.h的接口声明里时,又可以如期运行,我很好奇为什么那个实例变量square放在viewdidload方法里是可以正常工作的,那几个却不可以。想不透,求指点迷津。
你图里的就是“ viewdidload”方法。为什么它可以别的不行是因为到它这里才表示View加载完成,才可以开始做动画。

29,027

社区成员

发帖
与我相关
我的任务
社区描述
主要讨论与iOS相关的软件和技术
社区管理员
  • iOS
  • 大熊猫侯佩
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧