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

时间:2015-01-26 01:09:07

标签: swift xcode6

我有这个问题,我查看了很多主题,但没有找到答案,我正在使用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)
    }

}

1 个答案:

答案 0 :(得分:0)

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

1)我没有在调用类的开头MainViewController声明它,因此当它完成所有启动过程时,它会关闭并从内存中删除,因此GotoLinkURL功能不存在。

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