NSArray getter方法没有返回正确的值

时间:2012-05-30 06:28:00

标签: objective-c ios properties nsmutablearray nsarray

我正在制作一个程序,其中一个Class(classA)生成一个随机数并将其添加到一个可变数组中。视图控制器(viewControllerA)从classA调用方法并接收随机数组并将其存储在自己的数组中。

我有另一个需要相同数组的类(classB)。在viewcontrollerA完成它需要对数组做的事情之后,它会调用classB中数组的setter方法。我在classB中的数组的setter和getter方法中调用NSLog来检查它是否加载。

-(void)setRandomNumberArray:(NSArray *)randomNumberArray{
_randomNumberArray = randomNumberArray;

NSLog(@"%@ setter", _randomNumberArray);
}

-

-(NSArray *)randomNumberArray{
if (!_randomNumberArray) {
    _randomNumberArray = [[NSArray alloc] init];
}

NSLog(@"%@ getter", _randomNumberArray);
return _randomNumberArray;
}

当我在viewControlerA中调用setter方法时,NSLog返回数组的值。 当我在viewControllerB中调用getter方法时,NSLog不会从getter方法中打印任何内容。

2012-05-29 23:57:43.589 SwipeGame[8603:f803] (
) getter

这显然是设置数组但不保留它,因为我想要它。到底是怎么回事?我已经尝试了多种其他技术,它总是设置数组,但是当我想要“获取”数组时它不会保留它。

我的数组的属性设置为保留btw ..

更新: 是的我正在使用ARC。我的财产声明是:

@property (nonatomic, strong) NSArray *randomNumberArray

解决: 感谢你的帮助!这是一个实例问题。

3 个答案:

答案 0 :(得分:1)

你的setter方法没有提到viewControllerB。你只是设置一个内部变量。 viewControllerB如何知道已经设置的数组?

最简单的方法是使用@properties@synthesize

// in A
viewControllerB.array = _array; 

至于保留问题:如果你使用ARC,你不应该担心它。

答案 1 :(得分:0)

你使用ARC吗?

ARC版本:

@interface Foo : NSObject {
  NSMutableArray *_randomNumberArray;
}
@property (nonatomic, strong) NSMutableArray *randomNumberArray;
@end

@implementation Foo
@synthesize randomNumberArray = _randomNumberArray;
- (void)setRandomNumberArray:(NSMutableArray *)randomNumberArray {
    _randomNumberArray = randomNumberArray;
    NSLog(@"%@ setter", _randomNumberArray);
}

- (NSMutableArray *) randomNumberArray {
  if ( _randomNumberArray == nil )
    _randomNumberArray = [[NSMutableArray alloc] init];

  NSLog(@"%@ getter", _randomNumberArray);
  return _randomNumberArray;
}
@end

不是ARC版本:

@interface Foo : NSObject {
  NSMutableArray *_randomNumberArray;
}
@property (nonatomic, strong) NSMutableArray *randomNumberArray;
@end

@implementation Foo
@synthesize randomNumberArray = _randomNumberArray;
- (void)setRandomNumberArray:(NSMutableArray *)randomNumberArray {
    [_randomNumber release];
    _randomNumberArray = randomNumberArray;
    [_randomNumberArray retain];
    NSLog(@"%@ setter", _randomNumberArray);
}

- (NSMutableArray *) randomNumberArray {
  if ( _randomNumberArray == nil )
    _randomNumberArray = [[NSMutableArray alloc] init];

  NSLog(@"%@ getter", _randomNumberArray);
  return _randomNumberArray;
}

- (void)dealloc {
   [_randomNumberArray release];
}

@end

答案 2 :(得分:0)

如果您使用NSMutableArray创建此随机数数组,并将其传递给setter,则调用者稍后可能会对该数组进行突变(例如,所有项目都已移除),并且数组可能会从您的脚下发生变化

对于具有可变子类型的NSArrayNSString类型,您应该将您的属性声明为copy而不是strong。这将确保传递给您的数组不会被其他人在以后更改。复制性能不是问题,因为常规不可变类型非常有效地处理副本。