当前位置: 首页 > 面试题库 >

快速的二传手导致exc_bad_access

庄萧迟
2023-03-14
问题内容

我下面有一个简单的课程

import Foundation

public class UsefulClass: NSObject{
    var test:NSNumber{
        get{return self.test}
        set{
            println(newValue)
            self.test = newValue
        }
    }
    override init() {
        super.init()
        self.test = 5;
    }
}

我在这里初始化

import UIKit

class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        var testClass = UsefulClass()
    }
}

但是,这导致xcode打印出200 5s,然后由于EXC_BAD_ACCESS code = 2而崩溃。为什么会发生这种情况?


问题答案:

@vadian在他的回答中提供了一个解决方案,它可以解决您的问题。让我解释一下发生了什么。

您已经创建了一个计算属性,即一个没有变量支持的属性,取而代之的是,getter和setter方法通常在另一个存储的属性上进行一些处理,以便分别返回一个值并设置一个新值。

这是您的计算属性:

var test: NSNumber {
    get { return self.test }
    set {
        println(newValue)
        self.test = newValue
    }
}

查看getter的实现:

return self.test

它有什么作用?它读取test当前实例的属性,并返回它。哪个test物业?就是这个:

var test: NSNumber {
    get { return self.test }
    set {
        println(newValue)
        self.test = newValue
    }
}

是的,它是相同的属性。您的getter所做的是递归且无限期地自我调用,直到在运行时发生崩溃为止。

相同的规则适用于二传手:

self.test = newValue

它会不断调用自身,直到应用程序崩溃为止。



 类似资料:
  • 问题内容: 我的二传手迅速遇到了一个奇怪的问题。我有带有代码的PlayingCard类: 我在另一个类中使用此init()方法,实现如下所示: 当代码看起来像上面的代码时,我在一行中遇到了一个错误: 但是,当我从 等级 和 西服 属性中删除setter和getter时,它工作正常,没有出现错误。 您能解释一下为什么出现此 EXC_BAD_ACCESS 错误吗? 谢谢您的帮助 问题答案: 通过写这个

  • Hello World 如何调试 如何新增一个Controller 如何使用models/dao 如何使用models/service

  • 介绍 通过本章节你可以了解到 Vant 的安装方法和基本使用姿势。 安装 通过 npm 安装 在现有项目中使用 Vant 时,可以通过 npm 或 yarn 进行安装: # Vue 2 项目,安装 Vant 2.x 版本: npm i vant -S # Vue 3 项目,安装 Vant 3.x 版本: npm i vant@next -S 通过 CDN 安装 使用 Vant 最简单的方法是直

  • 安装 npm i feart --save-dev # or yarn add feart 引入组件 No.1 : 使用 babel-plugin-import (推荐) # 安装 babel-plugin-import 插件 npm i babel-plugin-import --save-dev // 在 .babelrc 或 babel.config.js 中添加插件配置 {

  • 本节课程提供一个使用 Spark 的快速介绍,首先我们使用 Spark 的交互式 shell(用 Python 或 Scala) 介绍它的 API。当演示如何在 Java, Scala 和 Python 写独立的程序时,看编程指南里完整的参考。 依照这个指南,首先从 Spark 网站下载一个 Spark 发行包。因为我们不会使用 HDFS,你可以下载任何 Hadoop 版本的包。 Spark Sh

  • 快速上手 本节将介绍如何在项目中使用 Element。 使用 vue-cli@3 我们为新版的 vue-cli 准备了相应的 Element 插件,你可以用它们快速地搭建一个基于 Element 的项目。 使用 Starter Kit 我们提供了通用的项目模板,你可以直接使用。对于 Laravel 用户,我们也准备了相应的模板,同样可以直接下载使用。 如果不希望使用我们提供的模板,请继续阅读。 引