isEqual在xcode中无法正常工作

时间:2015-04-27 10:49:30

标签: ios objective-c

我的代码看起来很合适但isEqual用来比较两个对象是不行的。我是iOS的新手。没有太多资源可以检查。 [box2 isEqual:box1]总是给我号码,但它应该给予肯定。我的代码有什么问题,请告诉我正确的事情。提前致谢。期待最好的建议。

#import <Foundation/Foundation.h>
@interface Box:NSObject
{
    double length;   // Length of a box
    double breadth;  // Breadth of a box
    double height;   // Height of a box
}
@property(nonatomic, readwrite) double height; // Property

-(double) volume;
//-(id)initWithLength:(double)l andBreadth:(double)b;
@end

@implementation Box

@synthesize height; 

-(id)init
{
   self = [super init];
   if(self)
   {
   length = 2.0;
   breadth = 3.0;
   }

   return self;
}

-(double) volume
{
   return length*breadth*height;
}

@end
@class Box;
int main (int argc, const char * argv[])
{
   NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
   Box *box1 = [[Box alloc]init];    // Create box1 object of type Box
   Box *box2 = [[Box alloc]init];
   NSLog (@"hello world");
   box1.height = 5.0;
   NSLog (@"%ld",[box1 volume]);

   if([box2 isEqual:box1])
   {
   NSLog(@"%b",[box2 isEqual:box1]);
   }
   [pool drain];
   return 0;
}

2 个答案:

答案 0 :(得分:3)

您必须在对象中覆盖isEqual方法。

e.g。在你的“@implementation Box”中

- (BOOL)isEqual:(id)object
{
    if ([object isKindOfClass:[Box class]]) {
        Box*box = (Box*)object;
        return self.height == box.height; // compare heights values
    }
    return [super isEqual:object];
}

答案 1 :(得分:0)

isEqual:工作得很好并且有记录,但不是你想象的那样。

isEqual:是NSObject的属性。如果两个对象指针相同则返回YES,否则返回NO。如果您想要不同的结果,则需要覆盖Box类的isEqual。请注意,isEqual:的参数可以是任何东西,而不仅仅是Box,所以你需要小心。

显然你不应该声明实例变量put属性,所以下面的代码假定。编写代码的方式,你会对实例变量高度,属性高度和实例变量_height产生一些困惑,这会让你头疼。它还假设您不是子类化Box(例如,您可以有一个彩色框,它不应该等于具有相同宽度,高度和宽度的框)。

- (BOOL)isEqual:(id)other
{
    if (! [other isKindOfClass:[Box class]]) return NO;
    Box* otherBox = other;
    return _length == other.length && _breadth == other.breadth 
           && _height == other.height;
}