发出同一个UIView对象的多个实例

时间:2011-02-07 10:29:38

标签: objective-c cocoa-touch ios uiview

我在iOS编程时遇到了问题。已经找了一些类似的问题,但还没有找到任何东西。

我正在创建至少8个自定义UIViews。正如您在附加代码中看到的那样,我正在运行循环,每轮创建一个实例。每个对象的引用都在内存中的不同空间上,但是当我更改一个对象中的值时,它只影响在最后一个循环(最后创建的实例)中创建的对象。 有任何想法吗?

PadView.h:

#import <UIKit/UIKit.h>

@interface PadView : UIView {

}

- (void)setText:(NSString*)text;

@end

PadView.m:

#import "PadView.h"
#import "AVFoundation/AVFoundation.h";

@implementation PadView

AVAudioPlayer *player;
UILabel *label;

- (void)setText:(NSString*)text {

    label.text = text;
}

- (void)initialize {

    label = [[ UILabel alloc ] initWithFrame:CGRectMake(0.0, 93.0, 107.0, 13.0)];
    label.backgroundColor = [UIColor clearColor];
    label.font = [UIFont boldSystemFontOfSize:9];
    label.textAlignment = UITextAlignmentCenter;
    label.text = @"Empty";
    [self addSubview:label];
    [label release];
}

- (id) initWithCoder:(NSCoder *)aCoder {

    if (self = [super initWithCoder:aCoder]) {

        [self initialize];
    }
    return self;
}

- (id) initWithFrame:(CGRect)rect {

    if (self = [super initWithFrame:rect]) {

        [self initialize];
    }
    return self;
}

- (void)dealloc {

    [super dealloc];
}

@end

创建对象:

NSMutableArray *pads = [[NSMutableArray alloc] initWithCapacity:8];

for (int i = 0; i < 8; i++) {

    PadView *pad = [[PadView alloc] initWithFrame:CGRectMake(0.0, i*150, 107.0, 107.0)];
    [padsView addSubview:pad];
    [pads addObject:pad];
}

调用setText:

PadView *pad = [pads objectAtIndex:5];
[pad setText:@"test"];

2 个答案:

答案 0 :(得分:2)

您的变量:

AVAudioPlayer *player;
UILabel *label;

@implementation块中定义,因此它们实际上是全局变量(在C意义上)。

基本上,PadView的所有实例在设置其text属性时都会更改相同的UILabel(这解释了您所看到的行为)。

我缺少一些上下文,但似乎你希望label成为一个实例变量(我也假设player)。如果是这种情况,您需要在@interface块中声明它们,如下所示:

@interface PadView : UIView {

    AVAudioPlayer *player;
    UILabel *label;

}

- (void)setText:(NSString*)text;

@end

答案 1 :(得分:0)

pads未初始化

NSMutableArray *pads = [[NSMutableArray alloc] initWithCapacity:8];

并且在添加为子视图和数组后必须释放垫

按照惯例,该类应命名为PadView,而不是padView

修改

for(padView *pad in pads){
    //manipulate each pad 
}



//manipulate a certain pad
padView *pad = [pads objectAtIndex:5];
pad. //...