【发布时间】:2026-01-25 00:45:02
【问题描述】:
流程-
NSObject 类用于生成具有某些属性的卡片。这被添加到 MutableArray 并相应地使用。然而,在另一个类中确定手牌结果的函数之后,MutableArray 失去了它的所有值。
现在我知道 MutableArray 只是指向对象而不是持有它们,所以为了让它失去所有它的值,我假设对象被 ARC 扫过。
-(void)rankHand {
NSString *echo = [Hand returnHandRank:_hand withString:false]; // 7 values in _hand
// 0 values in _hand.
NSLog(@"%@", echo);
}
断点后看问题,returnHandRank: withString:后出现问题
@interface Cards : NSObject
@property (nonatomic, strong) NSString *face;
@property (nonatomic, strong) NSString *suit;
@property (nonatomic, strong) NSString *symbol;
@property (nonatomic) int prime;
@property (nonatomic) int rankByInt;
+(NSMutableArray*)createDeck:(id)sender {
[sender removeAllObjects];
NSArray *faces = [[NSArray alloc] initWithObjects:@"A",@"2",@"3",@"4",@"5",@"6",@"7",@"8",@"9",@"10",@"J",@"Q",@"K", nil];
NSArray *suits = [[NSArray alloc] initWithObjects:@"h",@"d",@"c",@"s", nil];
NSArray *primes = [[NSArray alloc] initWithObjects:[NSNumber numberWithInt:41],[NSNumber numberWithInt:2],[NSNumber numberWithInt:3],[NSNumber numberWithInt:5],[NSNumber numberWithInt:7],[NSNumber numberWithInt:11],[NSNumber numberWithInt:13],[NSNumber numberWithInt:17],[NSNumber numberWithInt:19],[NSNumber numberWithInt:23],[NSNumber numberWithInt:29],[NSNumber numberWithInt:31],[NSNumber numberWithInt:37], nil];
for (int i = 0; i < 52; i++) {
Cards *card = [[Cards alloc]init];
card.face = [NSString stringWithFormat:@"%@", faces[i % 13]];
card.suit = [NSString stringWithFormat:@"%@", suits[i / 13]];
card.rankByInt = i % 13;
card.symbol = [Cards symbolForSuit:card.suit];
card.prime = [[primes objectAtIndex:(i % 13)] intValue];
[sender addObject:card];
}
[sender shuffle];
return sender;
}
创建_deck,然后_hand被填充
[_hand addObject:[_deck objectAtIndex:0]];
[_hand addObject:[_deck objectAtIndex:1]];
[_hand addObject:[_deck objectAtIndex:3]];
[_hand addObject:[_deck objectAtIndex:4]];
[_hand addObject:[_deck objectAtIndex:5]];
[_hand addObject:[_deck objectAtIndex:7]];
[_hand addObject:[_deck objectAtIndex:9]];
returnHandRank: withString: 是Hand 类中的一个很长的函数。所以这就是为什么我假设他们没有被保留。
谁能详细说明?我认为从_deck 再次添加卡片毫无意义,这会是最好的解决方案吗?
编辑:添加returnHandRank: withString:
+(NSString *)returnHandRank:(id)cards withString:(BOOL)returnString {
NSArray *combinations = [self returnCombinations];
cards = [self organizeCardsRankOrder:cards];
__block int maxRank = 0;
__block int maxValue = 0;
for (int i = 0; i < [combinations count]; i++) {
NSArray *splitString = [combinations[i] componentsSeparatedByString:@" "]; // splits the combination string.
NSArray *pointerArray = [[NSArray alloc] initWithObjects:
[NSNumber numberWithInt:[splitString[0] intValue]],
[NSNumber numberWithInt:[splitString[1] intValue]],
[NSNumber numberWithInt:[splitString[2] intValue]],
[NSNumber numberWithInt:[splitString[3] intValue]],
[NSNumber numberWithInt:[splitString[4] intValue]],
nil]; // turns the combinations into int values in an array.
NSMutableArray *fiveCardHand = [[NSMutableArray alloc] initWithObjects:
[cards objectAtIndex:[[pointerArray objectAtIndex:0] intValue]],
[cards objectAtIndex:[[pointerArray objectAtIndex:1] intValue]],
[cards objectAtIndex:[[pointerArray objectAtIndex:2] intValue]],
[cards objectAtIndex:[[pointerArray objectAtIndex:3] intValue]],
[cards objectAtIndex:[[pointerArray objectAtIndex:4] intValue]],
nil]; // Create the 5 card hand for the combination loop we are in, we'll now check this to see what rank it returns.
//Check for hand rank.
fiveCardHand = [self organizeCardsRankOrder:fiveCardHand];
NSArray *fiveCardHandOrganized = fiveCardHand;
int strength = [self handRankWithFiveCards:fiveCardHandOrganized];
if (strength > maxRank) {
maxRank = strength;
maxValue = 0;
}
int value = [self associateStrengthToHand:fiveCardHandOrganized andHand:strength];
if (value > maxValue) {
maxValue = value;
}
}
if (returnString) {
return [self handForStrengthWithStrength:maxRank];
} else {
return [NSString stringWithFormat:@"%i", maxValue];
}
}
【问题讨论】:
-
"所以为了让它失去所有的价值,我假设这些物体正在被 ARC 扫荡"好吧,你错了。如果发生这种情况,那将毫无意义。显然,如果一个对象已添加到数组中,则该数组会保留该对象。 — 听起来您的
returnHandRank:withString可能不会像您认为的那样做。但是出于某种原因,你选择不表现出来,即使你自己说这是问题的核心。这很难提供帮助。 -
@matt 好吧,我的印象是它是引用语义。但是,如果你说我错了,我想我错了。我已将函数添加到上述问题中。
-
_hand实例变量在哪里声明以及分配到哪里?它可能在某处被空数组覆盖...
标签: objective-c function class nsobject retain