僵尸对象 野指针

野指针:指针指向的对象已经被系统回收了,这个指针仍指向这个内存地址。

          C语言: 当我们声明1个指针变量,没有为这个指针变量赋初始值.这个指针变量的值是1个垃圾指 指向1块随机的内存空间。

  • OC语言: 指针指向的对象已经被回收掉了.这个指针就叫做野指针
  • 僵尸对象:已经被释放的对象。

    • . 内存回收的本质.

      • 申请1块空间,实际上是向系统申请1块别人不再使用的空间.
      • 释放1块空间,指的是占用的空间不再使用,这个时候系统可以分配给别人去使用.
      • 在这个个空间分配给别人之前 数据还是存在的.

        • OC对象释放以后,表示OC对象占用的空间可以分配给别人.
        • 但是再分配给别人之前 这个空间仍然存在 对象的数据仍然存在.
      • 僵尸对象: 1个已经被释放的对象 就叫做僵尸对象.

    • . 使用野指针访问僵尸对象.有的时候会出问题,有的时候不会出问题.

      • 当野指针指向的僵尸对象所占用的空间还没有分配给别人的时候,这个时候其实是可以访问的.
      • 因为对象的数据还在.
      • 当野指针指向的对象所占用的空间分配给了别人的时候 这个时候访问就会出问题.

      • 所以,你不要通过1个野指针去访问1个僵尸对象.

        • 虽然可以通过野指针去访问已经被释放的对象,但是我们不允许这么做.
    • . 僵尸对象检测.

      • 默认情况下. Xcode不会去检测指针指向的对象是否为1个僵尸对象. 能访问就访问 不能访问就报错.
      • 可以开启Xcode的僵尸对象检测. 
        • 那么就会在通过指针访问对象的时候,检测这个对象是否为1个僵尸对象 如果是僵尸对象 就会报错.
    • . 为什么不默认开启僵尸对象检测呢?

      • 因为一旦开启,每次通过指针访问对象的时候.都会去检查指针指向的对象是否为僵尸对象.
      • 那么这样的话 就影响效率了.
  • . 如何避免僵尸对象报错.

    • 当1个指针变为野指针以后. 就把这个指针的值设置为nil
  • 僵尸对象无法复活.

    • 当1个对象的引用计数器变为0以后 这个对象就被释放了.
    • 就无法取操作这个僵尸对象了. 所有对这个对象的操作都是无效的.

    • 因为一旦对象被回收 对象就是1个僵尸对象 而访问1个僵尸对象 是没有意义


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Monogame中创建场景对象、植物对象僵尸对象可以按照以下步骤进行编写: 1. 创建场景对象: - 在游戏类中创建一个名为Scene的类。 - 在Scene类中定义场景的属性,例如背景图片、场景大小等。 - 实现Scene类的构造函数,可以在构造函数中加载和设置场景所需的资源。 示例代码: ```csharp public class Scene { private Texture2D backgroundTexture; private Vector2 position; public Scene(Texture2D backgroundTexture, Vector2 position) { this.backgroundTexture = backgroundTexture; this.position = position; } public void Update(GameTime gameTime) { // 实现场景的更新逻辑 } public void Draw(SpriteBatch spriteBatch) { spriteBatch.Draw(backgroundTexture, position, Color.White); // 绘制场景的其他元素 } } ``` 2. 创建植物对象: - 在游戏类中创建一个名为Plant的类。 - 在Plant类中定义植物的属性,例如植物图片、位置等。 - 实现Plant类的构造函数,可以在构造函数中加载和设置植物所需的资源。 示例代码: ```csharp public class Plant { private Texture2D plantTexture; private Vector2 position; public Plant(Texture2D plantTexture, Vector2 position) { this.plantTexture = plantTexture; this.position = position; } public void Update(GameTime gameTime) { // 实现植物的更新逻辑 } public void Draw(SpriteBatch spriteBatch) { spriteBatch.Draw(plantTexture, position, Color.White); // 绘制植物的其他元素 } } ``` 3. 创建僵尸对象: - 在游戏类中创建一个名为Zombie的类。 - 在Zombie类中定义僵尸的属性,例如僵尸图片、位置等。 - 实现Zombie类的构造函数,可以在构造函数中加载和设置僵尸所需的资源。 示例代码: ```csharp public class Zombie { private Texture2D zombieTexture; private Vector2 position; public Zombie(Texture2D zombieTexture, Vector2 position) { this.zombieTexture = zombieTexture; this.position = position; } public void Update(GameTime gameTime) { // 实现僵尸的更新逻辑 } public void Draw(SpriteBatch spriteBatch) { spriteBatch.Draw(zombieTexture, position, Color.White); // 绘制僵尸的其他元素 } } ``` 在以上示例代码中,您可以根据实际需求添加更多属性和方法来实现场景、植物和僵尸对象的逻辑。请确保在游戏循环中调用它们的Update和Draw方法以更新和绘制它们。希望这可以帮助您开始编写植物大战僵尸游戏!如有任何问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值