1

我正在制作一个程序,其中一个类(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

已解决:感谢您的所有帮助!这是实例的问题。

4

3 回答 3

1

你用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
于 2012-05-30T07:20:09.490 回答
1

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

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

// in A
viewControllerB.array = _array; 

至于保留问题:如果您使用 ARC,则不必担心。

于 2012-05-30T06:39:52.393 回答
0

如果您使用 来创建此随机数数组NSMutableArray,并将其传递给设置器,则该数组可能会在稍后被调用者更改(例如,删除所有项目),并且该数组可以在您的脚下发生变化。

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

于 2012-05-30T10:11:51.433 回答