Objective-C语法之isEqual ,isEqualToString , == 三者的区别

isEqual: 首先判断两个对象是否类型一致, 在判断具体内容是否一致,如果类型不同直接return no.如先判断是否都是 NSString,在判断string的内容。

isEqualToString: 这个直接判断字符串内容。

==是直接比较指向的地址。


isEqual 和 isEqualToString 的区别:

IsEqual 是 NSObject 的方法 ,而 isEqualToString 是 NSString 的方法

因此从继承关系角度来说isEqualToString 是 isEqual 的衍生方法

首先贴个苹果官方重写isEqual 的demo

- (BOOL)isEqual:(id)other {  

if (other == self)   

 return YES;  

 if (!other || ![other isKindOfClass:[self class]])  

return NO;  

 return [self isEqualToWidget:other];  

}  

- (BOOL)isEqualToWidget:(MyWidget *)aWidget {  

 if (self == aWidget)  

 return YES;  

 if (![(id)[self name] isEqual:[aWidget name]])  

 return NO;  

if (![[self data] isEqualToData:[aWidget data]])  

 return NO;  

 return YES;  

}


简单说一下:

首先都会判断 指针是否相等 ,相等直接返回YES,

不相等再判断是否是同类对象或非空,空或非同类对象直接返回NO,

而后依次判断对象对应的属性是否相等,若均相等,返回YES

这样就不难理解 isEqualToString 的实现内部的了

最后解释 HashCode 和 isEqual 的关系

hash和isEqual:方法都在NSObject协议中声明,且彼此关系紧密。实现hash方法必须返回一个整型数(NSInterger),作为哈希表结构中的表地址。

两个对象相等(isEqual:方法的判断结果)意味着它们有相同的哈希值。如果哈希值相同,两个对象不一定相等。

如果您的对象可能被包含在象NSSet这样的集合中,则需要定义hash方法,比如UIWebView

并确保该方法在两个对象相等的时候返回相同的哈希值。

 

参考测试代码:

<span style="font-size:14px;">// 1.0    
NSString *str1 = [NSString stringWithFormat:@"skyming"];   
NSString *str2 = [NSString stringWithFormat:@"skyming"];   
NSLog(@"str1的地址--%p--str2的地址--%p",str1,str2);   
NSLog(@"== %d",str1 == str2);   
NSLog(@"isEqual--%d",[str1 isEqual:str2]);    
NSLog(@"isEqualToString--%d",[str1 isEqualToString:str2]);   
// 2.0   
 UIImage *image1 = [UIImage imageNamed:str1];   
 UIImage *image2 = [UIImage imageNamed:str2];   
 NSLog(@"image1的地址--%p--image2的地址--%p",image1,image2);   
 NSLog(@"== %d",image1 == image2);   
 NSLog(@"isEqual--%d",[image1 isEqual:image2]);    
// 3.0    
UIImageView *imageView1 = [[UIImageView alloc]initWithImage:image1];   
UIImageView *imageView2 = [[UIImageView alloc]initWithImage:image2];    
NSLog(@"imageView1地址--%p-imageView2地址--%p",imageView1,imageView2);    
NSLog(@"== %d",imageView1 == imageView2);   
NSLog(@"isEqual--%d",[imageView1 isEqual:imageView2]);}</span>




<span style="font-size:14px;">地址--0x15586d00--str2的地址--0x15586a40
2013-12-21 21:36:38.982 NSString[2029:60b] == 0
2013-12-21 21:36:38.988 NSString[2029:60b] isEqual--1
2013-12-21 21:36:38.992 NSString[2029:60b] isEqualToString--1
2013-12-21 21:36:39.004 NSString[2029:60b] image1的地址--0x1558ad00--image2的地址--0x1558ad00
2013-12-21 21:36:39.009 NSString[2029:60b] == 1
2013-12-21 21:36:39.013 NSString[2029:60b] isEqual--1
2013-12-21 21:36:39.017 NSString[2029:60b] imageView1地址--0x1558b0f0-imageView2地址--0x1558ba50
2013-12-21 21:36:39.022 NSString[2029:60b] == 0
2013-12-21 21:36:39.026 NSString[2029:60b] isEqual--0</span>



参考资料:

http://mobile.51cto.com/iphone-280494.htm

http://stackoverflow.com/questions/1112373/implementing-hash-isequal-isequalto-for-objective-c-collections?rq=1



  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 iOS Objective-C 中将点击事件传给 Flutter 层,可以通过 Flutter 提供的 `FlutterMethodChannel` 来实现。 首先,在 Objective-C 中创建一个 `FlutterMethodChannel` 对象,并指定对应的通道名称: ```objective-c FlutterMethodChannel* channel = [FlutterMethodChannel methodChannelWithName:@"your.channel.name" binaryMessenger:[self.flutterEngine binaryMessenger]]; ``` 然后,在需要将点击事件传给 Flutter 层的地方,调用 `FlutterMethodChannel` 对象的 `invokeMethod` 方法,将事件传给 Flutter: ```objective-c [channel invokeMethod:@"yourMethodName" arguments:@"yourArgument"]; ``` 接下来,就是如何将 Flutter 层传回的数据传递到 Objective-C 层了。同样地,可以使用 `FlutterMethodChannel` 来实现。 在 Flutter 中,创建一个 `MethodChannel` 对象,并指定对应的通道名称: ```dart MethodChannel _channel = MethodChannel('your.channel.name'); ``` 然后,在需要将数据传回 Objective-C 的地方,调用 `_channel` 对象的 `invokeMethod` 方法,将数据传回 Objective-C: ```dart _channel.invokeMethod('yourMethodName', 'yourArgument'); ``` 在 Objective-C 中,可以通过实现 `FlutterPlugin` 协议来接收 Flutter 层传回的方法调用以及参数: ```objective-c @interface YourPlugin () <FlutterPlugin> @end @implementation YourPlugin - (void)handleMethodCall:(FlutterMethodCall*)call result:(FlutterResult)result { if ([@"yourMethodName" isEqualToString:call.method]) { // 处理传回的数据 NSString* argument = call.arguments; // ... result(@"yourResult"); } else { result(FlutterMethodNotImplemented); } } @end ``` 这样,就完成了 Objective-C 和 Flutter 层之间的方法调用和数据传递。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值