SpriteBuilder代码中弱引用(weak)需要注意的地方
2015-09-26 19:06
429 查看
比如在GameScene类中有一个弹出菜单层实例的引用,我们有:
下面创建一个弹出菜单层的方法:
该段代码中第一个件判断if语句确保任何时刻只能有一个可见的弹出菜单层,甚至当该方法被意外连续运行2次也能确保如此.
代码逻辑很好懂,不懂也没关系;重要的是你可能会奇怪”为毛不直接将弹出菜单层的引用直接赋给_popoverMenuLayer,从而删除局部变量newMenuLayer?”
揭晓原因!!!因为_popoverMenuLayer被声明为弱引用,所以它不会保留赋给它的任何引用.当CCBReader load:方法返回时,即使仅有那么”一刹那”;没有强引用可以保留返回的节点.因此ARC将会release该(返回的)节点并且将_popoverMenuLayer赋值为nil,甚至在这之后立即调用addChild:方法也不行!
再明确的说:在debug配置中这种情况可能会也可能不会工作,取决于设备的debug配置;但是它在release配置中肯定不能工作!
再多说一点,我建议在addChild:方法代码前面添加NSAssert宏去验证newMenuLayer的值不为nil.这是因为popover可能在一个不同的文件夹中,可能CCB文件的名字输错了,或者仅仅是CCB文件还未被建立或已经建立但尚未published.
这些经常出错的问题,并不仅仅会在这个示例游戏代码中出现.所以一个好注意是尽可能早的抓住它们!(It’s a good idea to try and catch those early.)
@implementation GameScene{ //other ivars __weak GameMenuLayer *_popoverMenuLayer; } //other methods @end
下面创建一个弹出菜单层的方法:
-(void)showPopoverNamed:(NSString *)popoverName{ if (!_popoverMenuLayer) { GameMenuLayer *newMenuLayer = (GameMenuLayer*)[CCBReader load:popoverName]; NSAssert(newMenuLayer, @"newMenuLayer must not nil!!!"); [self addChild:newMenuLayer]; _popoverMenuLayer = newMenuLayer; _popoverMenuLayer.gameScene = self; _gameMenuLayer.visible = NO; _levelNode.paused = YES; } }
该段代码中第一个件判断if语句确保任何时刻只能有一个可见的弹出菜单层,甚至当该方法被意外连续运行2次也能确保如此.
代码逻辑很好懂,不懂也没关系;重要的是你可能会奇怪”为毛不直接将弹出菜单层的引用直接赋给_popoverMenuLayer,从而删除局部变量newMenuLayer?”
揭晓原因!!!因为_popoverMenuLayer被声明为弱引用,所以它不会保留赋给它的任何引用.当CCBReader load:方法返回时,即使仅有那么”一刹那”;没有强引用可以保留返回的节点.因此ARC将会release该(返回的)节点并且将_popoverMenuLayer赋值为nil,甚至在这之后立即调用addChild:方法也不行!
再明确的说:在debug配置中这种情况可能会也可能不会工作,取决于设备的debug配置;但是它在release配置中肯定不能工作!
再多说一点,我建议在addChild:方法代码前面添加NSAssert宏去验证newMenuLayer的值不为nil.这是因为popover可能在一个不同的文件夹中,可能CCB文件的名字输错了,或者仅仅是CCB文件还未被建立或已经建立但尚未published.
这些经常出错的问题,并不仅仅会在这个示例游戏代码中出现.所以一个好注意是尽可能早的抓住它们!(It’s a good idea to try and catch those early.)
相关文章推荐
- wift - 使用UIScreen类获取屏幕大小尺寸
- Event filter with query SELECT * FROM __InstanceModificationEvent WITHIN
- leetcode 272: Closest Binary Search Tree Value II
- uva 11404 Palindromic Subsequence(LCS回文串,最小字典序)
- iOS从0到100 雨笙博客 UIView的用法
- UITableView Cell一些常用的属性
- 15分钟搞定iOS9 Quick Actions
- iOS讲解迷惑深入浅出值UICollectionView(集合视图)
- UI:单例的写法
- iOS基础-UINavigationController、界面通信
- String,StringBuffer与StringBuilder的区别??
- String,StringBuffer与StringBuilder的区别??
- IOS图片拉伸的方法 UIImage stretchableImageWithLeftCapWidth:leftCapWidth:topCapHeight
- 第二十篇:滚动视图UIScrollView ,分页控制器UIPageControl 定时器 NSTimer
- iOS基础-UIScrollView、UIPageControl
- UVa1612 Guess
- Android4.0 Design之UI设计缺陷1
- 【POJ 3269】Building A New Barn
- Java String之String和CharSequence、StringBuilder和StringBuffer的区别
- android-requestFocus EditText 默认获得光标