Ios 如何确定指针指向的值何时为零
我的情况是军队可以攻击建筑物。每个部队都有一个指向其目标的指针Ios 如何确定指针指向的值何时为零,ios,objective-c,cocoa-touch,pointers,cocos2d-iphone,Ios,Objective C,Cocoa Touch,Pointers,Cocos2d Iphone,我的情况是军队可以攻击建筑物。每个部队都有一个指向其目标的指针 @property (nonatomic, weak) Building *target; 在更新循环中,部队定期对目标造成伤害 if (_target) { if (/*enough time has passed since last attack, attack again*/) { [_target attack]; if (_target.health <= 0)
@property (nonatomic, weak) Building *target;
在更新循环中,部队定期对目标造成伤害
if (_target)
{
if (/*enough time has passed since last attack, attack again*/)
{
[_target attack];
if (_target.health <= 0)
{
[_target removeFromParentAndCleanup:YES]; //Cocos2d
_target = nil;
}
}
}
else /* Find new target */
if(\u目标)
{
如果(/*自上次攻击以来已过足够的时间,请再次攻击*/)
{
[目标攻击];
如果(_target.health这里可能有我忽略的东西,但要检查target2
属性是否为nil
,只需执行以下操作:
if ( self.target2 == nil ) {
// Something
}
我认为您过于依赖ARC的实现,因为只有当指针为nil
时,您才知道对象是否已被删除。这是不可移植的,您能否保证对象被释放和指针变为nil
相反,使用对象的中心字典,根据其唯一ID映射,并仅存储此唯一ID而不是对象指针本身。在本例中,我使用递增整数对键使用NSNumber
,但可能有更好的键可以使用。另外object
是任何ob的基类要存储在此词典中的对象:
// Probably ivars in a singleton class
unsigned _uniqueId = 1;
NSMutableDictionary *_objects;
- (NSNumber *)addObject:(Object *)object
{
NSNumber *key = [NSNumber numberWithUnsignedInt:_uniqueId++];
[_objects setObject:object forKey:key];
return key;
}
- (void)removeObjectForKey:(NSNumber *)key
{
[_objects removeObjectForKey:key];
}
- (Object *)getObjectForKey:(NSNumber *)key
{
return [_objects objectForKey:key];
}
在目标中,只需存储建筑密钥:
@property (strong) NSNumber *buildingKey;
并通过提供的方法获得建筑物:
Building *building = (Building *)[objectDictionary objectForKey:buildingKey];
if (building != nil)
{
// building exists
}
else
{
// building does not exist; throw away the key
buildingKey = nil;
}
当指针指向的对象被解除分配时,指针本身被设置为nil。if(objectPointer==nil)
始终是检查Objective-C/Cocoa中的对象是否为nil的方法。如果指针不是nil,则表示所讨论的对象实际上尚未解除分配。如果取消引用指向对象的指针,则会得到一个结构,因此编译器会出错,即在if表达式中需要标量值
因此,在您的情况下,如果如果(self.target!=nil)
没有给您预期的结果,您应该查找对目标的剩余强引用(来自其他对象)
更广泛地说,正如特洛伊敌人的回答所暗示的那样,真正的程序逻辑依赖于ARC的归零弱引用行为,ARC的归零弱行为是可靠的/确定性的。但是,这确实意味着您必须确保当目标不再在赛场上(或其他任何地方)时,它们总是被释放。这有点脆弱。归零弱引用旨在避免保留周期(本质上是一种内存泄漏形式),而不是作为一种实现逻辑的方式。特洛伊敌人解决方案的要点是,您可以根据需要显式注册和注销目标,这可能是一种更为健壮的解决方案。由于目标是一个弱引用,您的代码应该“按原样”工作,假设[\u target removeFromParentAndCleanup:YES];
删除对目标的所有强引用
当删除最后一个强引用时,指向它的所有弱属性将自动设置为nil
。如果它们未自动设置为nil
,则仍然存在对目标的强引用
找到并删除该引用,这将正常工作。\u target
已经是指针,因此if(\u target)
或if(\u target!=nil)
是正确的。你能详细说明一下target1
和target2
是如何定义的吗?它们都是根据你问题开头的模式定义的吗?你问的问题不是100%清楚,但是Objective-C的指针基本上从来没有像那样被取消引用过,而且弱的对象指针确实是不正确的当所讨论的对象被释放时,我会选择。换句话说,问题的原因与您描述的不一样。@bdesham,是的,两者都是以相同的方式定义的,并将分配给该属性。@特洛伊木马如果您应该将您的注释转换为答案。没有target2
属性,我的示例中的target2
就是另一个属性这是我的错,名字不好!这是if(\u target)
试图做的,但它返回一个非空值问题是if(\u target)
检查指针,我需要检查指针的值eah,这是我问题的一部分:是否有办法在Objective-C中实现这种比较?
@JamesWebster当指针指向的对象被释放时,指针本身设置为nil。如果(objectPointer==nil)
始终是检查Objective-C/Cocoa中的对象是否为nil的方法。如果指针不是nil,则表示所讨论的对象实际上尚未解除分配。如果取消引用指向对象的指针,则会得到一个结构,因此编译器会出错,即在if表达式中需要标量值。“这是不可移植的,您能保证对象被释放和指针变为零之间的关系吗?"是的,这是不可移植到不支持ARC的另一个编译器的。但是,是的,您可以保证当对象被释放时,指针将变为nil
,因为ARC中的弱引用就是这样做的。这是弱引用定义的一部分。在我提出争议之前,我读得很慢,但Inafziger已经读过了为我完成=]这是一个相当过分的解决方案,我只是在Building=PNote中添加了一个isDestroyed
Boolean属性,另外,除非您有特定的理由直接使用iVar,否则使用该方法是很常见的(即self.target
)因此,如果您突然发现需要对提供目标的逻辑进行更改,那么将来会更容易。