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
)因此,如果您突然发现需要对提供目标的逻辑进行更改,那么将来会更容易。