黑马程序员—OC基础-- ==和 isEqual方法

本文探讨了Objective-C中的==运算符和isEqual方法的用法。==主要用于比较基本类型变量的值或者指针是否指向同一内存地址,而对于NSString,isEqual方法则判断字符串内容是否完全一致。同时,提到了常量池在管理NSString对象中的作用,确保相同字符串只有一个实例。

------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! ———



/******************************************

 *      今天对 “== isEqual方法进行学习.收获如下:

 *  1.  ==运算符:判断两个基本类型数值变量:值相等(不要求数据类型相同),返回真。

 *               判断两个指针类型的变量: 必须指针指向同一内存地址,才返回真。

 *               当使用==比较类型上没有继承关系的两个指针变量时,编译器会警告。

 *

 *  2.  isEqual判断NSString字符串时:只有字符序列完全相同,返回真。

 *                其他情况:与==运算符比较结果完全相同,因此实际应用中常常需要重写isEqual方法。

 *

 *  3.  @"hello" [NSString stringWithFormat:@"hello"]的区别:

 *               系统会使用常量池来管理@"hello",并且常量池保证相同字符串只有一个,创建多个@"hello"的指针,将指向同一对象。

 *

 *

 

 *******************************************/



代码实现:
#import <Foundation/Foundation.h>

/**************************************************************************************/
@interface LBXYUser : NSObject
@property(nonatomic,copy) NSString* name;
@property(nonatomic,copy) NSString* idstr;
- (id)initWithName: (NSString*)name andIdstr:(NSString*)idstr;
@end
/*******************************************/
@implementation LBXYUser

@synthesize name = _name;
@synthesize idstr = _idstr;
- (id)initWithName:(NSString *)name andIdstr:(NSString *)idstr
{
    if (self = [super init])
    {
        _name = name;
        _idstr = idstr;
    }
    return self;
}
- (BOOL)isEqual:(id)other
{   //如果两个对象指针指向同一内存,返回真
    if (self == other)
    {
        return YES;
    }
    //如果比较对象不为null,并且是同类实例
    if (other != nil && [other isMemberOfClass:LBXYUser.class])
    {
        LBXYUser* p = (LBXYUser*)other;
        return [self.idstr isEqual:p.idstr];    //以idstr属性判断是否相等
    }
    return NO;
}

@end
/**************************************************************************************/




int main(int argc, const char * argv[])
{
    @autoreleasepool
    {
        NSString* s1 = @"hello,李炎";//初始化两个常量池字符串
        NSString* s2 = @"hello,李炎";
        NSString* s3 = [NSString stringWithFormat:@"hello,李炎"];//初始化一个字符串对象
        
        NSLog(@"s1的地址:%p",s1);//常量池保证相同字符串只有一个,s1与s2指向同一块内存地址
        NSLog(@"s2的地址:%p",s2);
        NSLog(@"s3的地址:%p\n\n",s3);//s3是用方法创建的,并不在常量池中,与s1和s2指向的内存地址并不一样
        NSLog(@"s1与s2是否相等:%d",(s1 == s2));
        NSLog(@"s1与s3是否相等:%d\n\n",(s1 == s3));
        
        LBXYUser* p1 = [[LBXYUser alloc] initWithName:@"孙悟空" andIdstr:@"852963"];   //创建两个idstr相同的对象
        LBXYUser* p2 = [[LBXYUser alloc] initWithName:@"孙行者" andIdstr:@"852963"];
        LBXYUser* p3 = [[LBXYUser alloc] initWithName:@"孙午饭" andIdstr:@"123456"];   //创建与以上idstr不相同的一个对象
        NSLog(@"p1和p2是否相等?%d",[p1 isEqual:p2]); //idstr相等,故isEqual方法返回1
        NSLog(@"p2和p3是否相等?%d",[p2 isEqual:p3]); //idstr不相等,故isEqual方法返回0
    }
    return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值