需要对Singleton Pattern有所了解

时间:2011-11-04 13:44:48

标签: iphone objective-c ios cocoa

我将在此处粘贴代码,并根据逻辑方式对我想要理解的问题提出疑问。

@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,我只是想知道为什么会出现这种情况?

我只是想了解它在没有自我的情况下真正有什么区别?

感谢。

3 个答案:

答案 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的东西,当你绕过属性时,你的代码会更清楚。