ios - 使用@property声明与在方法内部声明的不同效果?
PHP中文网
PHP中文网 2017-04-17 14:57:55
[iOS讨论组]

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

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

PHP中文网
PHP中文网

认证0级讲师

全部回复(1)
高洛峰

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

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

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号