我将在此处粘贴代码,并根据逻辑方式对我想要理解的问题提出疑问。
@interface MySingleton : NSObject {
NSString *enteredCode;
}
@property (nonatomic, retain) NSString *enteredCode;
@end
@synthesize enteredCode;
-(void) addInput:(NSString *) input
{
self.enteredCode = [self.enteredCode stringByAppendingString:input];
}
- (void)dealloc {
[enteredCode release];
}
@end
在我的代码中,如果我使用“ self.enteredCode = [self.enteredCode stringByAppendingString:input ];”
一切正常,但“ enteredCode = [self.enteredCode stringByAppendingString:input]; ”它获取了exc_bad_access,我只是想知道为什么会出现这种情况?
我只是想了解它在没有自我的情况下真正有什么区别?
感谢。
答案 0 :(得分:3)
这与单身人士无关。当您执行self.enteredCode
时,您将通过设置为“保留”的财产。 stringByAppendingString
方法是一种方便的方法,它会向您返回一个自动释放的对象,这意味着它将在下一个运行循环的某个时刻释放。你需要保留这个值来阻止它被释放,当你通过通过分配属性时这很好,因为它被你正确保留,你可以随意使用它。
当你引用变量目录(没有self.
)时,你绕过了这个,因此你不会保留该值,随后会释放该值并引用坏内存和BOOOOOOOOM,访问不良。 / p>
答案 1 :(得分:1)
当您致电self.enteredCode = XXX
时,它会拨打[self setEnteredCode:XXX]
。由于您使用的是retain属性,因此将释放storedCode的旧值,并保留新值。
如果您直接操作enteredCode变量,您将有memleaks和崩溃,因为它会尝试释放以后不会保留的内容。
答案 2 :(得分:0)
如果我理解正确,self.enteredCode可以正常工作,但是enterCode失败。
如果是这种情况,那么我相信这是因为你绕过了财产并直接设置了iVar。这意味着您被分配了一个自动释放的对象并绕过了保留机制。
考虑为你的iVars使用类似_enteredCode的东西,当你绕过属性时,你的代码会更清楚。