构建一个自定义 UIPickerView 以便我可以让我的用户选择 24 小时时间,而无需进入设置应用程序并为整个手机打开 24 小时时间。有一些字符串和数组的顽固泄漏,我真的可以使用一些帮助。
只有三个地方使用了我用字符串创建的数组。小时和分钟都是NSArray
综合属性以及 ivars。
a) 在 viewWillAppear:animated 中,实际创建字符串和数组的地方:
if (TwentyFourHourMode) {
//set up arrays for 24 hour picker
NSMutableArray *hoursMutable = [[NSMutableArray alloc] init];
NSString *hourString;
for (int i = 0; i < 24; i++) {
if (i < 10) {
hourString = [NSString stringWithFormat:@"0%i", i];
} else {
hourString = [NSString stringWithFormat:@"%i", i];
}
[hoursMutable addObject:hourString];
}
self.hours = [[NSArray alloc] initWithArray:hoursMutable];
[hoursMutable release];
NSMutableArray *minutesMutable = [[NSMutableArray alloc] init];
NSString *minuteString;
for (int i = 0; i < 60; i++) {
if (i < 10) {
minuteString = [NSString stringWithFormat:@"0%i", i];
} else {
minuteString= [NSString stringWithFormat:@"%i", i];
}
[minutesMutable addObject:minuteString];
}
self.minutes = [[NSArray alloc] initWithArray:minutesMutable];
[minutesMutable release];
//more stuff which does not leak or reference the arrays/strings in question
} else {
//unrelated crap
}
b)在我的 UIPickerView 委托方法中 - 使用这两个数组的所有内容:
-(NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView {
return 2;
}
-(NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component {
if (component == 0) {
return self.hours.count;
} else if (component == 1) {
return self.minutes.count;
} else {
return 0;
}
}
- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
{
if (component == 0) {
return [self.hours objectAtIndex:row];
} else if (component == 1) {
return [self.minutes objectAtIndex:row];
} else {
return nil;
}
}
- (CGFloat)pickerView:(UIPickerView *)pickerView widthForComponent:(NSInteger)component {
switch(component) {
case 0: return 44;
case 1: return 50;
default: return 44;
}
}
- (void) pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
{
if (component == 0) {
[hour24 release];
hour24 = [self.hours objectAtIndex:row];
[hour24 retain];
} else if (component == 1) {
[minute24 release];
minute24 = [self.minutes objectAtIndex:row];
[minute24 retain];
}
c) 最后但同样重要的是,在 dealloc 中:
//set arrays to nil
self.hours = nil;
self.minutes = nil;
//release arrays
[hours release];
[minutes release];
分析是干净的,但仪器告诉我 hourString、minuteString 和 self.hours 都被泄露了。真正让我抓狂的是 self.minutes 并没有被泄露,而且它的代码格式似乎与 self.hours 相同——我什至复制粘贴后仍然得到相同的泄露/无泄露组合。
如果我能弄清楚这是从哪里来的,我会被诅咒的。有任何想法吗?你们可能需要帮助的任何其他代码?多谢你们!
编辑: EmptyStack 的建议已停止self.hours
并minuteString
没有被泄露,但hourString
仍在泄露,现在这段代码中出现了新的泄露,就在上面的内容下方viewWillAppear:animated
(self.incomingTime
是一个综合NSString
属性,这里的所有数组都是在本地初始化的):
NSArray *splitStrings = [self.incomingTime componentsSeparatedByString:@":"];
NSString *hourToDisplay = [splitStrings objectAtIndex:0];
//set this here so it doesn't give a null value
hour24 = [[NSString alloc] initWithString:hourToDisplay];
NSString *minuteSplitter = [splitStrings objectAtIndex:1];
NSArray *splitMinutes = [minuteSplitter componentsSeparatedByString:@" "];
NSString *minuteToDisplay = [splitMinutes objectAtIndex:0];
minute24 = [[NSString alloc] initWithString:minuteToDisplay];
编辑2:哦,因为大声哭泣,现在minuteString
又泄漏了。在我的头爆炸之前我要睡觉了。一夜之间的任何建议都将受到欢迎。