iPhone应用程序中SIngleton的价值问题

时间:2010-06-14 14:02:08

标签: iphone objective-c singleton

您在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

1 个答案:

答案 0 :(得分:3)

这一行:

name = [NSString stringWithFormat:@"hello"];

有问题。 name指的是实例变量,而不是您的属性。所以正在发生的事情是你的字符串被分配给name,但它是一个自动释放的对象。因此,在将来的某个时刻,name会自动释放并引用释放的内存。

如果您已将name属性指定为retaincopy,则以下任一行属性都会保留该对象:

self.name = [NSString stringWithFormat:@"hello"];
name = [[NSString stringWithFormat:@"hello"] retain];