在哪里初始化NSMutableArray以防止擦除

时间:2014-07-25 06:35:08

标签: ios objective-c initialization nsmutablearray

我试图创建一个NSMutableArray,当按下按钮时,它会添加一个浮点数(转换为NSInteger)。该按钮连接到timerViewController,它的实现文件中的代码块如下(你可以忽略if语句来解决这个问题):

- (IBAction)timeSaveButton:(UIButton *)sender {
    if ([self.timerStartOrStop.titleLabel.text  isEqual: @"Start"]){
        RecordedTimes *myTimes = [[RecordedTimes alloc] init];
        [myTimes addANewTime: self.timerTime];
    }
}

" RecordedTimes"它引用的类有NSMutableArray和" addANewTime"在.h文件中声明的方法

@interface RecordedTimes : NSObject

@property (nonatomic) NSMutableArray *recordedTimes;

-(void)addANewTime: (float) timerTime;

@end

其实施文件是

@implementation RecordedTimes

-(void) addANewTime:(float)timerTime{
    NSMutableArray *myTimes = [[NSMutableArray alloc] init];
    [myTimes addObject:[NSString stringWithFormat:@"%f", timerTime]];
}

@end

问题在于每次保存新时间时,阵列都会清空并仅存储最新的timerTime。我知道这是因为我的viewController(和addANewTime方法)每次初始化数组,导致它擦除其内容。如何解决这个问题以及在哪里初始化数组是我感到困惑的地方。

请在回复中详细说明。我是XCode和Objective-C的新手。感谢。

3 个答案:

答案 0 :(得分:2)

您已声明名为NSMutableArray的{​​{1}}属性,但从未将其初始化为空数组。在方便的地方,比如recordedTimes方法,你可以初始化它:

init

然后将- (id)init { self = [super init]; if (self) { self.recordedTimes = [[NSMutableArray alloc] init]; } return self; } 更改为:

addANewTime:

这确保您的可变数组属性初始化一次(因为初始化对象时调用- (void)addANewTime:(float)timerTime{ [self.recordedTimes addObject:[NSString stringWithFormat:@"%f", timerTime]]; } 一次),然后每次调用init时追加到数组的末尾。


此外,每次调用addANewTime:方法时,您都会重新创建RecordedTimes对象。您将要遵循相同的模式,并将其作为属性存储在视图控制器的类中,然后在timeSaveButton:方法之类的地方设置一次。


除此之外:您可能已经注意到您无法在{{viewDidLoad(或通常是原语,非对象类型)中存储int 1}}对象。您可以考虑将NSMutableArray转换为timerTimeNSNumber并将其存储在数组中而不是字符串中。

答案 1 :(得分:1)

要初始化属性,我通常在以下任一位置执行:

在视图控制器的viewDidLoad方法中。

(void)viewDidLoad {
    [super viewDidLoad];
    self.recordedTimes = [[NSMutableArray alloc] init];
}

或懒惰在您需要时初始化它,在这种情况下,当您第一次添加它时:

-(void) addANewTime:(float)timerTime {
    if (!self.recordedTimes) {
       self.recordedTimes = [[NSMutableArray alloc] init];
    }
    [self.recordedTimes addObject:[NSString stringWithFormat:@"%f", timerTime]];
}

另外,你做错了几件事:

  • 首先,您有一个局部变量,在执行方法addANewTime后会被解除分配。相反,您应该声明一个@property,只要viewController(或具有该属性的对象)处于活动状态,就可以使您的数组保持活动状态。
  • 我假设你想用@property (nonatomic) NSMutableArray *recordedTimes;做到这一点,但实际上你应该使用它,而不是局部变量。

答案 2 :(得分:0)

if ()
{
    RecordedTimes *myTimes = [[RecordedTimes alloc] init];
}

myTimes实例仅在if {}语句中有效。

-(void) addANewTime:(float)timerTime
{
    NSMutableArray *myTimes = [[NSMutableArray alloc] init];
}

此外,myTimes实例仅在addNewTime:方法中有效。

这就是为什么它似乎每次都要初始化。