您在iPhone应用中遇到单身类问题。 我已经创建了一个简单的类来显示NSString值。 当我尝试在textVIew中标记NSString时,我的问题就出现了。 我调用我的方法,Singleton类中的字符串值是(无效)(我已经使用debug测试了它)。 你能帮我解决代码解决方案吗?
我的代码:
#import "UntitledViewController.h"
#import "SingletonController.h"
@implementation UntitledViewController
@synthesize resetTextEvent;
@synthesize buttonSavePosition;
-(IBAction)stamp{
textEvent.text = [sharedController name];
}
- (void)viewDidLoad {
[super viewDidLoad];
sharedController = [SingletonController sharedSingletonController];
}
- (void)didReceiveMemoryWarning {
// Releases the view if it doesn't have a superview.
[super didReceiveMemoryWarning];
// Release any cached data, images, etc that aren't in use.
}
- (void)viewDidUnload {
// Release any retained subviews of the main view.
// e.g. self.myOutlet = nil;
}
- (void)dealloc {
[super dealloc];
}
@end
#import "SingletonController.h"
@implementation SingletonController
@synthesize name;
static SingletonController *sharedController = nil;
+(SingletonController*)sharedSingletonController{
if(sharedController == nil){
sharedController = [[super allocWithZone:NULL] init];
}
return sharedController;
}
+ (id)allocWithZone:(NSZone *)zone
{
return [[self sharedSingletonController] retain];
}
- (id)copyWithZone:(NSZone *)zone
{
return self;
}
- (id)retain
{
return self;
}
- (NSUInteger)retainCount
{
return NSUIntegerMax; //denotes an object that cannot be released
}
- (void)release
{
//do nothing
}
- (id)autorelease
{
return self;
}
-(id)init{
self = [super init];
if (self != nil) {
name = [NSString stringWithFormat:@"hello"];
}
return self;
}
-(void) dealloc {
[super dealloc];
}
@end
答案 0 :(得分:3)
这一行:
name = [NSString stringWithFormat:@"hello"];
有问题。 name
指的是实例变量,而不是您的属性。所以正在发生的事情是你的字符串被分配给name
,但它是一个自动释放的对象。因此,在将来的某个时刻,name
会自动释放并引用释放的内存。
如果您已将name
属性指定为retain
或copy
,则以下任一行属性都会保留该对象:
self.name = [NSString stringWithFormat:@"hello"];
name = [[NSString stringWithFormat:@"hello"] retain];