面向对象5

来源:互联网 发布:淮安java培训机构 编辑:程序博客网 时间:2024/06/05 16:55

OC的包装类

以下不是包装类:

  • NSInteger 大致等于 long 型整数
  • NSUInteger 大致等于 unsigned long 型整数
  • CGFLoat 在64位平台大致相当于 double ,在32为平台大致相当于 float

包装类:

  • NSValue
  • NSNumber

NSValue 是 NSNumber的父类,NSValue 代表一个更通用的包装类,NSNumber是更具体的包装类,NSNumber主要包括以下三个方法:

  • +numberWithXxx: 将特定类型值包装秤 NSNumber
  • -initWithXxx: 需要先创建一个 NSNumber 对象,再用一个基本类型的值来初始化NSNumber
  • -xxxValue: 返回该 NSNumber 对象包装的基本类型值
    PS: xxx代表int、char等各种基本类型
NSNumber* num = [NSNumber numberWithInt:20];NSLog(@"%d", [num intValue]);NSNumber* ch = [[NSNumber alloc] initWithChat:'J'];NSLog(@"%@", ch);

处理对象

打印对象和description

NSLog(@"变量为: %@", p); // 等价于 NSLog(@"变量为:%@", p.description);

@”张三” 和 [NSString stringWithFormat:@”张三”]的区别:

  • 对于前者,系统会使用常量池来管理这些字符串,而常量池中相同字符串只会有一个,所以代码 NSSting* s1 = @”张三”; NSString* s2 = @”张三”; 这两个指针指向的是同一个地址的字符串。
  • 后者创建的字符串是运行时创建出来的,存储在运行时内存区(堆内存),不会放在常量池中,故而可以产生多个相同字符串存储起来, NSString* s1 = [NSString stringWithFormat:@”张三”]; NSString* s2 = [NSString stringWithFormat:@”张三”]; 这两个指针指向的不是同一个地址的字符串,用 == 比较会返回 false。

== 和 isEqual: 的区别:
均为判断两个实例值是否等价,若是指针需是指向同一地址。

但有时当两个实例存储的字符串内容相同时,即可判断为等价,这时就需要重写 isEqual: 方法,其实 NSString已经重写了 NSObject 的 isEqual: 方法

重写 isEqual: 方法应该满足一下条件:

  • 自反性:[x isEqual x] 一定为真
  • 对称性:[x isEqual y] 为真,则[y isEqual x] 也为真
  • 传递性:[x isEqual y] 和 [y isEqual z] 为真,则 [x isEqual z] 也为真
  • 一致性:如果x和y中用于等价比较的关键信息没有变动,那么无论比较多少次,[x isEqual y] 应该总是为真/假
  • 对于任何不是 nil 的 x ,[x isEqual nil] 一定为假

重写 isEqual: 方法示例:

//其余代码忽略,以 idStr 作为判断等价的关键属性- (BOOL) isEqual: (id) other{    //如果两个对象为同一对象,则一定为真    if(self == other)    return YES;    //当 other 不为 nil ,且与self为同类型实例时,进行判断    if(other !+ nil && [other isMemberOfClass: MyUser.class])    {        MyUser* target = (MyUser*) other;        //返回两者的 idStr 值是否一致的判断结果        return [self.idSt isEqual: target.idStr];    }    return NO;}

PS: NSString 中不仅重写了 isEqual: 方法,还地ing一了一个isEqualToString: 方法来判断当前值域另一个字符序列是否等价。

0 0
原创粉丝点击