我想知道如何将对象作为目标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]
}
答案 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];
}