2012-02-29 3 views
1

Мне было интересно, как передать объекты в качестве параметров в объекте C. Как вы можете видеть, в моем коде Obj1 * myObj1 выходит за рамки метода btnIncrementObj1. Как поместить его в область видимости? Я думаю, что есть способ сделать экземпляры класса статическими.Глобальные экземпляры класса в Objective C

Как вы можете видеть, я хочу, чтобы 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] 
} 

ответ

1

ОК, вот мой ответ. Это расширилось на тот, который дал Ланк.

Во-первых, вам нужно решить, какой должна быть область myObj1. Вы хотите один экземпляр класса или только один для всего приложения. Если это экземпляр класса, создайте переменную экземпляра и создайте свойство, которое создает его по требованию. например

@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, должен измениться.

+0

Большое спасибо за это. Удивительно большой ответ. – iggy2012

1

Если вы хотите получить доступ к переменной во всем классе, сделайте ее как член класса.

+0

Что бы код для этого быть? – iggy2012

0

Вы должны создать свой объект сразу после

@implementation 

Здесь вы можете создать его как статический объект:

static Obj1* _myObj1 = nil; 

здесь на вас может получить к нему доступ из других классов, как это:

[Obj1 myObj1].property 
+0

Это обычная практика, чтобы сделать это, даже если моя цель состоит в том, чтобы делать только при нажатии кнопки? – iggy2012

+0

Да. Это делается практически во всех моих приложениях, которые обмениваются объектами. Если он решил вашу проблему, пожалуйста, оцените как лучший ответ. – wizH

+0

@ iggy2012: нет, это не обычная практика. Вероятно, вы хотите создать члена класса в приведенном выше примере. Глобальные объекты - почти всегда плохая идея. – JeremyP

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]; 
} 
Смежные вопросы