2012-05-12 53 views
0

更新:子類中的保留陣列

我已經創建了子類UIImageView,以使某些圖像可以通過觸摸手勢移動。在視圖控制器中,我有一個數組保存每個imageview的初始位置。 我的問題是,只要從子類調用該數組,該數組就會返回null。這個想法是檢查圖像是否在原來的位置,或者如果它已經被移動過,我已經剝離了代碼,只是NSLog發生了什麼事情,但問題依然存在,並且使我瘋狂。

ViewController.h

NSMutableArray *originalPositions; 
@property (nonatomic, retain) NSMutableArray *originalPositions; 
-(void)testLogging; 

ViewController.m

@synthesize originalPositions; 

- (void)viewDidLoad { 
originalPositions = [[NSMutableArray alloc]init]; 
} 

-(void)drawImages { 
for (int i = 0; i < imagesArray.count; i++) { 
CGRect frame = CGRectMake(65 * i, 10, 60, 60); 
draggableView *dragImage = [[draggableView alloc] initWithFrame:frame]; 

    NSString* imgName = [imagesArray objectAtIndex:i]; 
    [dragImage setImage:[UIImage imageNamed:imgName]]; 
    [dragImage setUserInteractionEnabled:YES]; 
    [self.view addSubview:dragImage]; 

    NSString *originalPositionAsString = NSStringFromCGPoint(dragImage.center); 
    [originalPositions addObject:originalPositionAsString]; 
} 
} 
-(void)testLogging { 
NSLog(@"Logging array: %@", originalPositions); 
} 

-(IBAction)btnClicked { 
[self testLogging]; 
} 

當從類中的IBAction爲(或任何其他方式)調用時,「testLogging'法正確地NSLogs陣列但如果我從子類中調用相同的方法,則NSLogs爲null:

Subclass.m

- (void)touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event { 
ViewController *viewController = [[ViewController alloc] init]; 
[viewController testLogging]; 
} 
+1

好了,我不明白是什麼代碼是應該做的 - 'populatePositionsArray'需要先叫,但您發佈不會做這樣的片段......你可以稱之爲'populatePositionsArray'在初始化,也許 – Axel

+0

Axel是正確的,你必須確保populatePositionsArray它被調用一次並且用類的初始化。 – rishi

回答

0

我填充它後,通過將數組寫入plist文件來解決此問題。不是很優雅,但工作。

感謝您的幫助,雖然傢伙。

0
self.originalPositions = [[NSMutableArray alloc]init]; 

這已經是內存泄漏,當你調用self.originalPositions = bla,那麼'bla'將被保留。這意味着保留計數被提高。這意味着你的可變數組的保留計數爲2,並且一旦你的UIImageView不見了,它就會泄漏。

至於其他方面,我不知道你的代碼有什麼問題。我的第一個猜測是你沒有調用populatePositionsArray,你應該在創建/顯示視圖時調用它,所以當你調用touchesBegan的時候你肯定會填充數組。

或者,您可以在touchesBegan中包含'if'語句來檢查數組是否存在,否則在繼續之前調用populatePositionsArray來填充它。

+0

populatePositionsArray在父視圖的viewdidload中調用,它正確地NSLogs數組。接下來我要做的是觸摸其中一個視圖,觸發我正確發佈的下一個片段,但該數組爲空。可能在子類中插入一個init方法會有所作爲嗎? – oskare

+0

檢查您的代碼是否有重複項,您可能會重新分配實例varsomewhere,這意味着您只需獲得一個空數組 –

+0

我已經更新了上述問題,因爲我已經隔離了該問題。沒有重複。謝謝。 – oskare