Objective C中的类的全局实例

时间:2012-02-29 09:38:06

标签: objective-c static

我想知道如何将对象作为目标C中的参数传递。如您所见,在我的代码中,Obj1 * myObj1超出了btnIncrementObj1方法的范围。我该如何把它放在范围内?我认为有一种方法可以将类的实例设置为静态。

如您所见,我只希望myObj1在按下按钮时实例化,而不是在加载视图时实例化。

有没有办法让Obj1静态,或者给它一个全局范围?

- (IBAction)btnCreateObj1:(UIButton *)sender 
{
    Obj1 * myObj1 = [[Obj1 alloc] init];

    int intVal = [self.textField.text intValue];

    [myObj1 increment:intVal];

    [myObj1 restring:@"orig string 1"];

    NSString * newLabel = [self.labelObject1.text stringByAppendingFormat:@"value:%d string:%@",myObj1.value,myObj1.someString];

    self.labelObject1.text = newLabel;
}

- (IBAction)btnIncrementObj1:(UIButton *)sender
{
    //-I want to increment myObj1.value by [self.textField.text intValue]
}

4 个答案:

答案 0 :(得分:1)

如果要在整个班级中访问变量,请将其作为班级成员。

答案 1 :(得分:1)

好的,这是我的回答。这扩展了Lanc给出的那个。

首先,您需要确定myObj1的范围应该是什么。您是希望每个类的实例还是整个应用程序只有一个实例。如果它是类的每个实例,则创建一个实例变量并具有一个按需创建它的属性。 e.g。

@interface MyViewController : UIViewController

@property (nonatomic, readonly, retain) Obj1* myObj1;

// other stuff

@end

@implementation MyViewController
{
@private 
    Obj1* myObj1;
}

-(Obj1*) myObj1
{
    @synchronized(self) // if you know you are single threaded you can omit the @synchronized block
    {
        if (myObj1 == nil)
        {
            myObj1 = [[Obj1 alloc] init];
        }
    }
    return myObj1;
}

- (IBAction)btnCreateObj1:(UIButton *)sender 
{
    [[self myObj1] increment:intVal];

    [[self myObj1] restring:@"orig string 1"];

    NSString * newLabel = [self.labelObject1.text stringByAppendingFormat:@"value:%d string:%@",myObj1.value,myObj1.someString];

    self.labelObject1.text = newLabel;
}

- (IBAction)btnIncrementObj1:(UIButton *)sender
{
    [[self myObj1] increment: [self.textField.text intValue]];
}

如果您需要一个单例(即每个程序只有一个对象),您可以根据wizH的答案使用静态变量,但我更喜欢使用方法来访问它。所以以下内容将起作用:

@interface MyViewController : UIViewController

@property (nonatomic, readonly, retain) Obj1* myObj1;

// other stuff

@end

@implementation MyViewController

-(Obj1*) myObj1
{
    static Obj1* myObj1 = nil; // instance var moved to be a static variable
    @synchronized([MyViewController class) // if you know you are single threaded you can omit the @synchronized block
    {
        if (myObj1 == nil)
        {
            myObj1 = [[Obj1 alloc] init];
        }
    }
    return myObj1;
}

- (IBAction)btnCreateObj1:(UIButton *)sender 
{
    [[self myObj1] increment:intVal];

    [[self myObj1] restring:@"orig string 1"];

    NSString * newLabel = [self.labelObject1.text stringByAppendingFormat:@"value:%d string:%@",myObj1.value,myObj1.someString];

    self.labelObject1.text = newLabel;
}

- (IBAction)btnIncrementObj1:(UIButton *)sender
{
    [[self myObj1] increment: [self.textField.text intValue]];
}   

请注意,唯一改变的是如何满足类的API。没有使用API​​的代码必须更改。

答案 2 :(得分:0)

您应该在

之后立即创建对象
@implementation

在这里,您可以将其创建为静态对象:

static Obj1* _myObj1 = nil;

从这里开始,你可以从其他类中访问它:

[Obj1 myObj1].property

答案 3 :(得分:0)

您的.h文件应导入您要保留的对象,并在该类中创建该对象的成员。 它看起来像这样。

#import "Obj1.h";

@interface MyViewController : UIViewController{
    Obj1 * myObj1;
}

我不会在IBAction方法中初始化一个类变量,但你可以这样做。 在创建的按钮中,您可以保留相同的代码。但是在你的另一种方法中,只需检查myObj1是否已创建。

- (IBAction)btnIncrementObj1:(UIButton *)sender
{
    if(myObj1){
        //Handle the increment.
    }else{
        //Handle what to do if you haven't clicked the other button before this one. 
    }
}

为了获得良好的内存管理,你应该在dealloc中释放对象

-(void) dealloc{
    if(myObj1){
        [myObj1 release];
    }
    [super dealloc];
}