2010-11-12 23 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

相關問題