我正在制作一个程序,其中一个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
解决: 感谢你的帮助!这是一个实例问题。
答案 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,则调用者稍后可能会对该数组进行突变(例如,所有项目都已移除),并且数组可能会从您的脚下发生变化
对于具有可变子类型的NSArray
和NSString
类型,您应该将您的属性声明为copy
而不是strong
。这将确保传递给您的数组不会被其他人在以后更改。复制性能不是问题,因为常规不可变类型非常有效地处理副本。