2010-11-12 41 views
0

我遇到了数据持久存在于我创建的多个对象实例中的问题。数据不会持续存在于同一对象的多个实例中(iOS)

我有一个类“IconViewController”延伸的UIViewController,我的信息传递到诸如应当使用图像的名称:

 

//IconViewController.h 

@interface AppIconViewController : UIViewController 
{ 
    NSString *imageName; 
} 

@property (nonatomic, retain) NSString *imageName; 

- (void) doSomething; 


//IconViewController.m 

@implementation AppIconViewController 

@synthesize imageName; 

NSNumber *iconWidth; 

- (void)loadView 
{ 
    [super loadView]; 

    UIImageView *iconImage = [[UIImageView alloc] initWithImage:[UIImage imageNamed:imageName]]; 
    iconWidth = [NSNumber numberWithFloat:iconImage.bounds.size.width]; 
    [iconImage release]; 

    NSLog(@"iconWidth: %f", [iconWidth floatValue]); 
} 

- (void) doSomething 
{ 
    NSLog(@"iconWidth: %f", [iconWidth floatValue]); 
} 
 

在另一个视图控制器,我实例几个实例这些IconViewControllers和传递不同大小的图像对他们说:

 

AppIconViewController *appIcon1 = [[AppIconViewController alloc] initWithNibName:nil bundle:nil]; 
appIcon1.imageName = @"Image65PXWide.png"; 
[self.view addSubview:appIcon1.view]; 

AppIconViewController *appIcon2 = [[AppIconViewController alloc] initWithNibName:nil bundle:nil]; 
appIcon2.imageName = @"Image105PXWide.png"; 
[self.view addSubview:appIcon2.view]; 
 

好了,诡异的是,当我创建这些,我得到的日志后面是准确的... appIcon1日志“iconWidth:65.0”和appIcon2日志“iconWidth:105.0”。但是,当我打电话:

[appIcon1 doSomething];

...我的日志 “iconWidth:105.0”。

为什么第一个实例中的数据反映了第二个实例中的数据?我错过了什么?

编辑:
我知道,如果我在头声明iconWidth和合成它作为一个属性,它会成功。所以我想知道如何使它的私人版本持续下去。因为我试图保留NSNumber:

iconWidth = [[NSNumber numberWithFloat:iconImage.bounds.size.width] retain];

...并且它仍然不起作用。它是否需要综合和公开?

编辑#2:
好了,所以我想通了,有一次我在我的头声明iconWidth,它工作得很好,和我没有合成它,所以它保持它的私密性。不确定为什么如果在实现文件中声明它不工作 - 是否有人知道为什么以及如果在实现的顶部声明变量而不在头中有任何目的?现在只是好奇而已。

回答

0

合成不会使任何私人。它只是根据声明的属性生成getter/setter方法。

通过将iconWidth在实施中,任何方法外,它本质上是一个类级变量。所以它被写入它的最后一件东西覆盖。您已经在界面中声明了imageName,那么为什么不只是在那里放置iconWidth(实例变量默认为私有)呢?

+0

谢谢Brian,它为我清除它。 – redhotvengeance 2010-11-14 06:01:01

0

在您的方法doSomething中,您假定iconWidth设置正确。

然而,iconWidth创建为在的loadView方法自动释放的对象,所以当完成的loadView,主循环会释放iconWidth和你所得到的随机值。

为了解决这个问题,你必须保留iconWidth所以你可以在其他方法

iconWidth = [[NSNumber numberWithFloat:iconImage.bounds.size.width] retain]; 

作为一般规则,方法不使用init启动会返回自动释放对象使用它,所以你必须要小心你如何实例化一个对象,以及是否需要调用retain。

+0

感谢您的回答!我只是编辑了我的帖子,说如果我保留它就像你刚刚展示的那样,它仍然不起作用,这很奇怪。我得到它的唯一方法是将它合成为一个属性,但是我想知道是否可以保持私有。 – redhotvengeance 2010-11-12 23:37:46

相关问题