
1.)发送到setter的值是非零的;
2.)当尝试分配值时,EXC_BAD_ACCESS发生,变量为nil;
在Cocoa和Cocoa touch应用程序中使用这种模式都会导致EXC_BAD_ACCESS,所以我不认为它是平台,但我相信这是我正在使用的模式.
我的问题是,是在分配变量时,还是我创建属性的方式?
我创建了一个虚拟项目,如下图所示.
任何帮助表示赞赏.
编辑:做一些挖掘,我将setter的变量(不是属性名称)的名称更改为firstname__.基本上,setFirstname的setter中的代码:
- (voID)setFirstname:(Nsstring *)firstname__{ self.firstname = firstname__;} 这样做可以通过说firstname__(而不是self.firstname)等于nil来清除一点混乱,即使在AppDelegate中,该值也是非零的.
解决方法 你的问题是递归.在setter中,您再次调用setter方法,并且一次又一次.当你申报时
self.firstname = first name__;
基本上相当于
[self setFirstname:first name__];
因此,该方法调用自身,这没有多大意义.
首先需要围绕属性和实例变量.
Objective C类实例通常包含保存值的实例变量.
尽管可以通过@public限定符将这些变量暴露给外部世界,但这不是既定惯例.
惯例是具有属性,其在幕后是围绕私有实例变量的“包装器”.
因为在Objective C中,您只能通过消息与其他对象进行通信,以便能够访问您具有setter的实例变量的值以及在向对象发送适当的消息时调用的getter方法.
当您声明属性时,现代目标C会隐式为您创建实例变量.通常说这些属性由实例变量支持.
通常没有理由显式实现setter和getter,因为编译器会在幕后为您执行此 *** 作. (以同样的方式,它也为你创建那些实例变量)
但是如果你想明确地实现setter,你需要在setter中设置实例变量,而不是再次调用setter本身(通过点符号约定),如上所述.
隐式创建的实例变量具有以下划线作为前缀的命名约定.在你的情况下它是
_firstname
声明名为firstname的属性时,还会获得一个实例变量
_名字
你的setter应该是这样的
-(voID)setFirstname:(Nsstring *)firstname { _firstname = firstname;} 并且得到了
-(Nsstring *)getFirstname{ return _firstname;} 总结 以上是内存溢出为你收集整理的Objective-C属性Getter / Setter崩溃EXC_BAD_ACCESS全部内容,希望文章能够帮你解决Objective-C属性Getter / Setter崩溃EXC_BAD_ACCESS所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)