SpriteBuilder代码中弱引用(weak)需要注意的地方

简介:

比如在GameScene类中有一个弹出菜单层实例的引用,我们有:

@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.)

相关文章
|
11月前
|
存储 Java
浅识静态函数
静态函数(百度):函数调用的结果不会访问或者修改任何对象(非static)数据成员,这样的成员声明为静态成员函数比较好。且如果static int func(....)不是出现在类中,则它不是一个静态成员函数,只是一个普通的全局函数,只不过由于 static 的限制,它只能在文件所在的编译单位内使用,不能在其它编译单位内使用。
|
12月前
|
安全 C语言 C++
引用和指针傻傻分不清
🐰引用和指针的区别 🌸从现象上看 🌸从编译上看 🤔提示
|
编译器 C语言 C++
【是C++,不是C艹】 引用的概念 | 引用的使用 | 引用与指针的区别(一)
【是C++,不是C艹】 引用的概念 | 引用的使用 | 引用与指针的区别
100 0
|
存储 安全 编译器
【是C++,不是C艹】 引用的概念 | 引用的使用 | 引用与指针的区别(二)
【是C++,不是C艹】 引用的概念 | 引用的使用 | 引用与指针的区别
66 0
|
Java Python Spring
spring注入静态变量有几种方法?不看的都掉坑里了!
spring注入静态变量有几种方法?不看的都掉坑里了!
|
缓存 Java
弱引用该怎么用?
弱引用该怎么用?
93 0
弱引用该怎么用?
|
iOS开发
iOS开发:block死循环及__weak弱引用提前释放的问题解决
block死循环及__weak弱引用提前释放的问题解决
289 0
|
Swift
Swift5.1—强引用循环与weak
Swift5.1—强引用循环与weak
203 0
Swift5.1—强引用循环与weak
|
缓存 算法 Java
谨防JDK8重复类定义造成的内存泄漏
谨防JDK8重复类定义造成的内存泄漏
谨防JDK8重复类定义造成的内存泄漏
|
Java Android开发 C++
【Android NDK 开发】JNI 引用 ( 局部引用 | 局部引用作用域 | 局部引用产生 | 局部引用释放 | 代码示例)
【Android NDK 开发】JNI 引用 ( 局部引用 | 局部引用作用域 | 局部引用产生 | 局部引用释放 | 代码示例)
185 0