.m文件肯定有 @synthesize gravity = _ gravity;吧,相当于给个另外的名字,self. gravity附值会调用set方法
在setGetvity : (Getvity*) newGetvity 中应该也有一行代码是 _getvity  = newGetvity;吧,set.gravity会调用get方法也就是-(UIGravityBehavior*)gravity,你那里相当于无限递归调用了,模拟器应该主线程卡死了

解决方案 »

  1.   

    这是有关属性property 的访问与存储的问题。 在一个类中如果声明了属性,那么编译器会在编译时自动为我们生成getter,setter 方法。getter方法用来访问,setter方法用来赋值。如果自己在代码中实现了对属性的getter,setter ,编译器在编译时就不会再生成对属性的getter,setter方法,它会以用户指定的getter,setter来调用。在你上面的代码中,你自己就实现了gravity,animator的getter访问器。那么当我们通过self.gravity来访问这个属性时,它会自动调用你自己实现的
    -(UIGravityBehavior*)gravity {} 
    这个访问gravity属性的方法。回归到你的问题,如果你在gravity 的访问器内部再使用self.gravity来访问,运行时当碰到self.gravity单独出现或出现在语句左边时,都表示在访问,这时会自动跳转到getter访问器中执行get访问。所以你在(1)处使用self.gravity会使你的访问递归调用,直至耗尽内存。第(2)处的  [self.animator addBehavior:_gravity]; self.animator 在右侧出现表示我们在给animator这个属性赋值,也就是会调用animtor属性 的setAnimator方法。这里使用self.animator 可能在赋值时处理一些其它的逻辑。如果没有,也可以直接用局部变量来替换。
      

  2.   

    仔细想了下,大概明白了。但是我理解的(2)和你有些不同,这里写self.animator是为了调用animator的get方法申请内存,如果只写_animaor的话,_animaor这个值还是nil呢,所以不会成功。貌似不涉及赋值操作吧。
      

  3.   

    仔细想了下,大概明白了。但是我理解的(2)和你有些不同,这里写self.animator是为了调用animator的get方法申请内存,如果只写_animaor的话,_animaor这个值还是nil呢,所以不会成功。貌似不涉及赋值操作吧。
    嗯,是我看错了,你的理解是对的。