为什么我的字符串不会显示在UIAlertView中

时间:2011-10-21 02:07:51

标签: objective-c ios class properties uialertview

首先,我已经对此进行了彻底的研究,但未能找到符合我要求的任何内容。

我的问题是:我在Class1中创建了一个字符串属性,然后如下所示进行合成。

@interface Class1 : UIViewController 
{
    NSString *testvar;
}

@property (nonatomic, retain) NSString *testvar;

@end



@implementation Class1

@synthesize testvar

- (void)viewDidLoad
{
    [super viewDidLoad];
    self.testvar = @"Test variable";
}
@end

这适用于定义变量/属性的值,因为它在由它定义的相同UIAlertView方法显示的测试viewDidLoad中工作。当另一个类Class2生成时,会出现问题尝试检索和使用该属性。第二类中使用的代码如下:

Class1 *foo = [[Class1 alloc]init];
UIAlertView *alert = [[UIAlertView alloc]initWithTitle: @"Title"
                                               message:foo.testvar
                                              delegate:self
                                     cancelButtonTitle:@"OK"
                                     otherButtonTitles:nil];
[alert show];
[alert release];
[foo release];

会发生UIAlertView显示,但没有消息。我相信Class1 testvar属性的值在Class2尝试检索它之前被释放,或者我设置错误。我说这是因为我尝试了同样的事情,但使用的是int而不是NSString。我在Class1的viewDidLoad中将in​​t的值设置为3,当显示UIAlertView时,它显示int的值,但显示为“0”,即int的默认值,而不是我的设置值。 / p>

对于Objective-C相对较新并且还没有很好地掌握内存管理,我认为错误与我设置属性值的位置或方式有关。任何见解将不胜感激。提前谢谢。

3 个答案:

答案 0 :(得分:6)

你做错了。仅当在另一个类中初始化该视图时才调用viewDidLoad方法。

在Class1中定义一个方法 - (id)init并移动你的self.testvar = @“Test Variable”;进去。然后它应该按预期工作。

- (id)init
{
   if(self = [super init])
   {
     self.testvar = @"Test Variable";
   }
   return self;
}

答案 1 :(得分:0)

您还没有为testvar分配任何内容。在这一点上它仍然是一个零对象。

你需要像

这样的东西
foo.textvar = @"my message";

无论如何都基于你上面的代码。

顺便说一句,你不需要在那时发布警报。您可以在返回警报引用的委托方法中释放它。

您可以粘贴完整代码以便更好地理解吗?

答案 2 :(得分:0)

您可以为此使用全局变量。

在一个类中声明并定义它,您可以在项目中的任何其他类中使用它。

就像你可以在ClassA中声明一个字符串,你可以在ClassB中使用它。

<强> ClassA的:

NSString *textVar = nil;

textVar = @"Your Message";

<强> ClassB的:

extern NSString *textVar;

UIAlertView *alert = [[UIAlertView alloc]initWithTitle: @"Title
                                 message:textVar     
                                 delegate:self
                                 cancelButtonTitle:@"OK"
                                 otherButtonTitles:nil];
                                 [alert show];
                                 [alert release];