views:

74

answers:

1

Hi have a problem with singleton Class in iPhone app. I have create a simple class for visualization of NSString value. My problem is generate when i try to stamp a NSString in a textVIew. I call my methods and the value of string in Singleton class is (invalid) (i have tested it with debug). Can you help me with the code solution.

my code:

#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
+3  A: 

This line:

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

is problematic. name refers to an instance variable, not your property. So what's happening is your string is being assigned to name, but it's an autoreleased object. So, at some point in the future, name is released automatically and refers to deallocated memory.

If you've specified the name property as either retain or copy, then either of the following lines will property retain the object:

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