使用@property声明与在方法内部声明的不同效果?

标题不好取,直接上代码:

//@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方法自动生成外有些什么不同的地方,进而会造成上述的情况?

阅读 2.5k
1 个回答

没有效果是因为它在方法结束的时候就被释放掉了。

把它保存在 property 里,property 默认的内存管理语义是 retain,所以会把这个对象的引用计数+1,这个对象还能一直活着,实现你的效果;而作为一个局部变量,它在作用域结束的时候就被释放掉了,后面也没法实现你的效果了。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏