标题不好取,直接上代码:
//@Interface内
@property(nonatomic,strong)UIView *squareView;
@property(nonatomic,strong)UIDynamicAnimator *animator;
//ViewDidAppear:内
self.squareView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)];
self.squareView.center = self.view.center;
self.squareView.backgroundColor = [UIColor blueColor];
[self.view addSubview:self.squareView];
self.animator = [[UIDynamicAnimator alloc] initWithReferenceView:self.view];
//UIDynamicAnimator *animator1 = [[UIDynamicAnimator alloc] initWithReferenceView:self.view];
UIGravityBehavior *gravity = [[UIGravityBehavior alloc] initWithItems:@[self.squareView]];
[self.animator addBehavior:gravity];
就这么几行代码,用来实现一个view的落体效果,但写的时候有个疑问:
当我使用@property来声明对象名并用self.来调用时,编译后没有问题,效果ok。
但是直接用UIDynamicAnimator *obj这样的方式声明并使用后,没有实现效果。
平时若只是局部使用的对象,都是使用OBJ *obj的方式声明,不知道规范不规范。之前在看一个开源项目时也遇到过这种问题,一直抱有疑问。
说到底@property和OBJ *obj声明除了作用域和getter,setter方法自动生成外有些什么不同的地方,进而会造成上述的情况?
没有效果是因为它在方法结束的时候就被释放掉了。
把它保存在 property 里,property 默认的内存管理语义是 retain,所以会把这个对象的引用计数+1,这个对象还能一直活着,实现你的效果;而作为一个局部变量,它在作用域结束的时候就被释放掉了,后面也没法实现你的效果了。