简体   繁体   中英

Objective-c Iphone how to set default value for a property

Hi i've got the following code in a ViewController.h:

#import <UIKit/UIKit.h>

@interface CalcViewController : UIViewController {
    NSNumber* result;
    NSString* input;
    //NSString* input = @"";

    IBOutlet UITextField* display;
}

@property (retain) NSNumber* result;
@property (retain) NSString* input;
@property (nonatomic, retain) UITextField* display;

@end

The problem is that I want to append a string to input but this is not possible when its still null. Thats why I want to set the default value of input to be @"". But where do I put this code.

I'm aware of one possible solution where you put it in a default constructor. But I've got no idea in what file to put this. And where I should call it from.

I unfortunately only got a limited understanding of C and realise that perhaps a .h file is not the right place.

The project type is a View-Based-Application if you should need this.

Hope you can help.

You may find it useful to read some documentation on Objective-C or Cocoa. You probably can find some good suggestions on reading material if you perform a search here in StackOverflow or on Google.

To answer your question, you should have a @implementation of CalcViewController. One would most often place this @implementation inside of the *.m file. If your *.h file is named "ViewController.h" then the implementation would go in "ViewController.m".

You would then create a copy of the UIViewController's initialization function and place it there (I don't know what the default init function is).

For example:

@implementation CalcViewController

@synthesize result;
@synthesize input;

- (id)initWithNibName:(NSString*)aNibName bundle:(NSBundle*)aBundle
{
    self = [super initWithNibName:aNibName bundle:aBundle]; // The UIViewController's version of init
    if (self) {
        input = [[NSString alloc] initWithString:@""]; // You should create a new string as you'll want to release this in your dealloc
    }
    return self;
}

- (void)dealloc
{
    [input release];
    [super dealloc];
}
@end // end of the @implementation of CalcViewController

NOTES:

  • You may want to rename the file to CalcViewController. I believe it is easier for Xcode's refactoring engine to deal with.
  • You do not need to declare the @property for the display instance variable as you connect that with Interface Builder. Unless you want clients of the CalcViewController to change it often

EDIT: April 28, 2009: 10:20 AM EST: I suggest actually allocating a NSString as you should technically release it in the dealloc.

EDIT: April 28, 2009: 11:11 AM EST: I updated the @implementation to use the UIViewController's version of init.

Very good question. The short answer is to init the values in the init function. You need to overwrite the default init function so that the default value is ready before the object can be used. I would like to suggest people stop suggesting others to read document; please answer the question directly if you can.

Another option is to write your own getter for your input property, and return @"" if the instance variable is nil. This would work even if you accidentally or intentionally assigned nil to input, whereas using init to set a default value would break.

The most obvious way to implement it would be like following:

  1. In your viewcontroller.m file, override the default init method. This method is called everytime a view controller is initialized. So, it's the best way to initialize your variable.

     - (id)initWithNibName:(NSString*)aNibName bundle:(NSBundle*)aBundle { self = [super initWithNibName:aNibName bundle:aBundle]; // The UIViewController's version of init if (self) { varName = [[NSString alloc] initWithString:@""]; } return self; } 
  2. Now, whereever in your code you want to append a string to your original string, simply use: varName = [NSString stringwithformat:@"%@%@", varName, newString];

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM