oc是面向对象的语言,与java类似,由于存在int,double,float等类型,因此,提供了NSValue和NSNumber来封装c语言中的基本类型。
注意:
NSInteger,NSUInteger,CGFloat这些是利用typedef定义的新类型,其并不是类,仍然是基本类型。
NSValue与NSNumber
其中,NSValue是NSNumber的父类,两者都是包装类,NSValue更加通用,宽泛,其可以包装short,int,float,double,char,对象id等,包装以后,其便可以添加到NSArray,NSSet等集合中。相反,NSNumber更加具体,其主要用于包装C语言中的各种数值类型。
NSNumber主要包含了如下的3类方法:
1、+ numberWithXxx:该类方法直接将特定类型的值包装成NSNumber;
2、- initWithXxx:该实例方法需要先创建一个NSNumber对象,再用一个基本类型来初始化;
3、- xxxValue:该实例方法返回该NSNumber对象包装的基本类型的值。
案例代码:
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
@autoreleasepool {
NSNumber* num=[NSNumber numberWithInt:20];
NSNumber* de=[NSNumber numberWithInt:3.4];
NSLog(@"%d",[num intValue]);
NSLog(@"%g",[de doubleValue]);
NSNumber* ch=[[NSNumber alloc]initWithChar:'J'];
NSLog(@"%c",[ch charValue]);
}
return 0;
}
Object-c对象都是NSObject子类的实例,所以可以直接调用该类中定义的方法。description方法是NSObject类的一个实例方法,所有的Object-C类都是NSObject的子类,因此,所有的Object-C对象都具有description方法。description方法类似于Java中的toString方法,用于自我描述。
当利用NSLog(@"%@",xxx)输出一个对象时,起输出此对象的描述信息,默认为《对象名:12位16进制数》;
通常在程序中用于打印出对象的状态,所以利用如下的格式:
《类名:[实例变量1=xxx,实例变量2=xxx]》。
案例代码:
LWBApple.h文件:
#import <Foundation/Foundation.h>
@interface LWBApple : NSObject
@property (nonatomic,copy)NSString* color;
@property(nonatomic,assign)double weight;
-(id) initWithColor:(NSString*)color weight:(double)weight;
@end
#import "LWBApple.h"
@implementation LWBApple
@synthesize color=_color;
@synthesize weight=_weight;
-(id) initWithColor:(NSString*)color weight:(double)weight {
if (self=[super init]) {
self.color=color;
self.weight=weight;
}
return self;
}
-(NSString*) description{
return [NSString stringWithFormat:@"<LWBApple[_color=%@,_weight=%g]>",self.color,self.weight];
}
@end
main.m
#import <Foundation/Foundation.h>
#import "LWBApple.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
LWBApple* apple=[[LWBApple alloc]initWithColor:@"白色" weight:2.78];
NSLog(@"%@",apple);
}
return 0;
}
==和isEqual方法
OC用来测试两个变量是否相等的两种方式,一种是利用==运算符,另一种是利用isEqual方法。
对于“==”来说,如果是数值类型,则只要两个变量的值相等(不一定要求数据类型严格相同),使用==判断就讲返回YES;而对于两个指针类型的变量,它们必须返回同一个对象(即两个指针变量保存的内存地址相同)时,==判断才会返回真。没有继承关系的两个指针变量会提示警告或者编译错误。
注意:@“hello”和[NSString stringWithFormat:@"hello"]所返回的地址是不同的,而且存储方式也是不一样的。其中,@“hello”就是C语言中的字符串常量加上@符号,保存在常量池中。而利用NSString方法生成的字符串起是存储在堆中。
案例程序如下:
#import <Foundation/Foundation.h>
#import "LWBApple.h"
int main(int argc, const char * argv[]) {
NSString* s1=@"天气晴朗";
NSString* s2=@"天气晴朗";
NSString* s3=[NSString stringWithFormat:@"天气晴朗"];
NSString* s4=[NSString stringWithFormat:@"天气晴朗"];
NSLog(@"s1与s2==%d",s1==s2);
NSLog(@"s3与s4==%d",s3==s4);
NSLog(@"s1==%p\n s2==%p\n s3==%p s4==%p",s1,s2,s3,s4);
return 0;
}
结果:
注意:在程序中的%p表示输出指针所指示的地址,利用0x01xxxxxl来表示。
常量池保证相同的字符串直接量只有一个,不会产生多个副本。
对于isEqual方法来说,对于字符串,并不要求两个指针变量所指示的地址相等,而是要求所指示的内容相同,此时,利用isEqual来表示。[str isEqual str2]l.
NSString重写了NSObject的isEqual方法,其判断标准是只要两个字符串所包含的字符序列相同,通过isEqual比较将返回真,否则返回假。因此,我们可以重写isEqual方法来实现比较。
判断一个实例是否属于某一个类,利用isMemberOfClass成员方法,其实NSObject的一个方法,如果属于则返回true。