有时EXC_BAD_ACCESS和有时无法识别的选择器发送到实例

问题描述 投票:0回答:1

我有这个问题,我查看了很多主题,但没有找到答案,我正在使用Swift。

我正在向一个url发送一个异步请求,它返回给我一个xml代码,我像往常一样解析并在NSMutableArray中的Custom对象中安排它的内容。

假设该数组包含类AppsObject的3个对象,其中包含ID,图像的URL字符串,Text和URLtring,以便稍后使用它来让UIButton通过浏览器转到指定的url页面。

我创建了一个名为AppsView的类,它有一个裸露的初始化器和另一个自定义视图位置和大小的初始化器,并为上面提到的链接添加一个ImageIcon和一个按钮。

在主视图控制器中,我在for循环中启动appview,以创建包含NSmutableArray数据的多个appview。

我得到错误消息是因为动态生成的UIButton并将(addTarget)设置为同一对象中的函数。

有人能帮我吗?您将找到以下代码:

class AppView: NSObject {

    var BackView = UIView()
    var AppIconView = UIImageView()
    var DescriptionLabel = UILabel()
    var LinkIcon = UIImageView()
    var AppNo:Int!
    var DescriptionText:String!

    let originView:UIView!
    let LinkImage = UIImage(named: "HyperLink.png")
    var LinkButton = UIButton.buttonWithType(UIButtonType.System) as UIButton

    let BackViewHeight:CGFloat = 130.0
    let AppIconSize:CGFloat = 110.0
    let Inset:CGFloat = 5.0
    let BackgroundAlpha:CGFloat = 0.5
    let LinkButtonSize:CGFloat = 35.0
    let LinkButtonURL = NSURL()



    override init() {
        super.init  ()
    }

    init(sourceView:UIView, AppIconURLString: String , LoadedDescription: String , ObjectNo: Int , LinkButtonURL: NSURL){
        super.init()

        originView = sourceView
        ImagesLoader.downloadImage(NSURL(string: AppIconURLString)!, handler: {image, error in
            self.AppIconView.image = image
        })

        DescriptionText = LoadedDescription
        AppNo = ObjectNo

        setupAppView()
    }


    func setupAppView() {
        //SetupBackView
        BackView.frame = CGRectMake(Inset,
                                    Inset + (CGFloat(AppNo) * 140.0),
                                    originView.bounds.size.width - (Inset * 2),
                                    BackViewHeight)

        BackView.backgroundColor = UIColor.blackColor().colorWithAlphaComponent(BackgroundAlpha)

        BackView.clipsToBounds = false
        originView.addSubview(BackView)

        //SetupAppIconView
        AppIconView.frame = CGRectMake(BackView.bounds.size.width - AppIconSize - Inset*2, Inset*2, AppIconSize, AppIconSize)

        AppIconView.clipsToBounds = false
        BackView.addSubview(AppIconView)

        //SetupLabelView
        DescriptionLabel.frame = CGRectMake(Inset, Inset, BackView.bounds.size.width - Inset - AppIconSize - Inset, AppIconSize)
        DescriptionLabel.text = DescriptionText
        DescriptionLabel.textColor = UIColor.whiteColor()

        BackView.addSubview(DescriptionLabel)

        //SetupButtonView
        LinkButton.frame = CGRectMake(Inset, BackView.bounds.size.height - LinkButtonSize - Inset, LinkButtonSize, LinkButtonSize)
        LinkButton.setImage(LinkImage, forState: .Normal)
        LinkButton.addTarget(self, action: "GotoLinkURL:", forControlEvents:UIControlEvents.TouchUpInside)
        LinkButton.tag = AppNo
        BackView.addSubview(LinkButton)
    }

    func GotoLinkURL(sender:UIButton!) {
        println(sender.tag)
    }

}
swift xcode6
1个回答
0
投票

我发现我的问题在哪里。我阅读了一些Apple内存管理并阅读了有关NSZombie的内容,这让我知道NSObject因为多种原因从内存中删除了,它是:

1)我没有在调用类的开头声明它是MainViewController所以当它完成所有的启动程序时,它关闭并从内存中删除,所以GotoLinkURL函数不存在。

2)然后我在MainViewController中声明但我发现最后一个对象只存在于内存中因为我在for循环语句中调用它所以我在数组中保存所有NSObjects并且这样做了。

© www.soinside.com 2019 - 2024. All rights reserved.