您的位置:首页 > 其它

oc基础知识

2014-08-18 11:51 267 查看
基础知识(Foundation)

NSRange (location length)
NSPoint\CGPoint (CGFloat x, CGFloat y)

NSSize\CGSize (CGFloat width ,CGFloat

heighet)

NSRect\CGRect (NSPoint,NSSize)

typedef assing long NSUInteger;

例子: @“i love oc”

NSRange r1 = {2,4}; //可读性差不用

NSRange r2 = {location = 2,length = 4}; //

不用这个 ,太长

开发中用这个:

NSRange r3 = NSMakeRange(2,4);

查找一个单词在字符串中的范围:(重点)

NSString *str = @"i love oc";

NSRange range = [str rangeOfString :"love"];

NSLog(@"location=%d,length=%d",range.location,range.length);

如果找不到 length = 0 ,location = NSNoFound = -1

开发中常用:

CGPoint p1 = NSMakePoint(10,15);

NSPoint p1 = CGPointMake(10,15);

NSSize s1 = CGSizeMake(100,50);

CGSize s3 =NSMakeSize(100,50);

将CGRectMake();里的数字打印出来:

CGRect r1 = CGRectMake(0,0,100,50);

将结构体转化为字符串输出:NSString *str = NSStringFromPoint(p1);

NSLog(@"%@".str);

另一种创建CGRect方法

CGRect r2 = {{0,0}{100,90}};

或者:

CGRect r3 = {p1,s2}

比较两个点的坐标是否相同:依赖于CoreGrahics

BOOL b = CGPointEqualToPoint(CGPoint

(10,12),CGPointMake(10,12));

比较SIZE 以此类推。

判断函数里包不包含点:

BOOL b2 = CGRectContainsPoint(CGRectMake(50,50,100,50),CGRectMake(50,70));

NSLog(@"%d",b2);

字符串的创建:

1,NSString *str = @"1132123";

2,NSString *str2= [[NSString alloc] initWithString:@"jack"];

3,NSString *str3 = [[NSString alloc]

initFormat:@"age is %d",10];

C字符串转换 oc字符串:

4,NSString *str4 = [[NSString alloc] initWithUTF8String:"jack"];

OC字符串转换 C字符串:

5,const char *c = [str4 UTF8String];

6,类方法创建:

1>[NSString stringWithFormat:@""];

2>[NSString stringWithcontentsOfFile:]

3>[NSURL URLWithSting:@""]

7,NSString *str5 =[[NSString alloc] initWithContentsOfFile:@"路径名"encoding:

NSUTF8StingEncoding error:nil];

8,NSSting *str6 =[[NSString alloc]

initWtihContentsOFUrl:(NSURL*) encoding:NSUTF8StingEncoding error:nil];

读取文件:

1,NSString *str5 =[[NSString alloc] initWithContentsOfFile:@"路径名"encoding:

NSUTF8StringEncoding error:nil];

2,NSURL *url = [[NSURL alloc]
initWithString:@file//"路径名"];

NSLog(@"s6=\n"%@.s6);

利用方法检测代码:

[@"jack\n jack"writeToFile:@"路径"atomically:Yes encoding:NSUTF8StringEncoding error:nil];

NSMutableString:可变字符串

NSMutableString *s1 = [NSMutableString stringWithFormat:@"my age is 10"];

1>拼接内容到s1后面:

[s1 appendString:@"11 12"];

2>删除字符串中的某个字符,先要获取这个字符的范围,在删除、(比如删除 'is')

NSRange range = [s1 rangeOfString:@"is"];

[s1 deletecharacterInRange:range];

NSString:不可变字符串

NSString *s2 =[NSString

stringWithFormat:@"age is 10"];

NSString *s3 = [s2 stringByAppendingStingString:@"11 12"];

解释 :调用s2字符串 并且在s2字符串原有的字符的基础上拼接上@“11 12” 把拼接好的字符串

赋值给了s3 ,s2字符串只是复制 ,并没有改变,改变的是新对象s3.

这就是字符串可变和不可变得本质区别。

集合类 :NSArray NSSet NSDictionary

NSArray:不可变数组

NSMutableArray:可变数组

NSArray oc数组

oc数组 只能存放oc对象类型,但有个缺点不能放基本数据类型和空值(nil)。

比如: int struct enum等。

1,NSArray的创建:

NSArray *array2 = [NSArrayarrayWithObject:@"jack"];

注意:当只有一个元素的时候

NSArrayarrayWithObject 的Object后没有s,并且元素后也没有nil.

NSArrat *array3 = [NSArray arrayWithObjects:@"jack",@"rose",nil];

//nil:是数组元素结束的标记

2,怎么验证数组中有几个元素

[array2 count];

array2,count;

NSLog(@"%ld",array2.count);

3,怎么访问里面的每一个元素那

有两种方式:Index:索引

1>NSLog(@%@,[arrayobjectAtIndex:1]);//淘汰不用了

2>array3[0]; //仿c数组访问

NSLog(@"%@",arry3[0]]);

4假如数组中有4个元素

以前方法:

NSArrat *array4 = [NSArray arrayWithObjects:@"jack",@"rose",@"321313",nil];

简化后:@是一个关键字,表示创建一个对象

@[]:代表创建一个新的数组。

//快速创建一个NSArray对象

NSArray *array4 = @

[@"jack",@"rose",@"321313"];

NSArray遍历:

第一种方式:

Person *p = [[Person alloc]init];

NSArray *array = @[p,@"jack"];

for (int i = 0;i<array.count;i++)

{

NSLog(@"%@,array[i]");

}

p是指针:打印结果是类名+内存地址。

第二种方式:叫快速遍历。

开发中使用

Person *p = [[Person alloc]init];

NSArray *array = @[p,@"jack"];

把数组中的每一个元素一个一个拿出来赋值给obj.

每赋值一次执行一次循环体。

id obj代表着数组中的每一元素。

for(id obj in array)

{ //找出obj元素在数组中的位置

NSUInteger i= [array

indexOfObject:obj];

NSLog(@"%ld - %@",i,obj);

}

快速遍历的另一种方式://每遍历到一个元素,就会调用一次block,并且当前元素和索引位置

当做参数传给block。

[array enumerateObjextsUsingBlock];

^(id obj,NSUInteger idx,BooL *stop)

{

NSLog(@"%ld - %@",idx,obj);

if(idx == 0)

{

//停止遍历

*stop = YES;

}

}];

NSMutableArray 可变数组

NSMutableArray *array = [NSMutableArray arrayWithObject:@"rose",@"jim",nil];

添加元素

[array addObject:[[Person alloc]init]];

[array addObject:@""jack]

删除所有元素

[array removeAllObjects];

删除指定元素

[array removeObject:@"jack"];

删除第N(写数字)个索引位置的字符

[array removeObjectAtIndex:N]

NSLog(@"%ld",array.count);

看看数组中少了那个字符(元素),打印整个数组

NSLog(@"%@",array);

注意事项:

@[@"jack",@"rose"] 返回的是NSSarray,是不可变数组。

NSMutableArray *array = @[@"jack",@"rose"]

这种写法是错误的。

NSSet 没有快速创建方法

NSMutableSet 随时可以加对象,但加进去的对象是没有顺序的。

NSSet *s = [NSSet set];

NSSet *s2 = [NSSet

setWithObjects:@"jack","rose","jack1","jack2",nil];

随机取出一个元素。

NSString *str = [s2 anyObject];

NSLog(@"%ld",s2.count);

NSMutableSet

NSMtableSet *s =[NSMutable set];

添加元素

[s addObject:@"jack"];

删除元素

[s removeObject:(id)];

NSSet 和 NSArray的对比

1,共同点

都是集合,都能存放多个OC对象{基本数据类型不能放}

都有一个可用的子类

本身不可变

2,不同点

NSArray有顺序,NSSet顺序。

NSdictionary 字 典

里面存储的东西都是键值对。key->value

使用场合:一对一关系的时候

NSDictionary *dict = [NSDictionary dictionaryWithObject:@"jack" forkey:@"name"];

id obu = [dict objectForKey:@"name"];

NSLog(@"%@",obj);

NSDictionary *dict = [[NSDictionary dictionaryWithObjects:objects forKeys:keys]];

NSDictionary *dic = [NSDictionary dictionaryWithObjectsAndKey;

@“jack”,@"name";

@"北京",@“address”,

@"32323232",@"qq",nil];

id obj = [dic objectForKey:@"name"];

开发中用:

NSDictionary *dic = @{

@“name”:@"jack",

@“adress”:@"北京"};

id obj =dict[@"name"];

NSLog(@"%@",obj);

访问键值对的个数:

NSLog(@"%ld",dict.count);

NSMutableDictionary *dict =
[NSMutableDictionary dictionary];

添加键值对

[dict setObject:@"jack" forKey@"name"];

[dict setObject:@"北京" forKey@"address"];

删除键值对

[dict removeObjectForKey:@"name"];

NSLog("%@",dict); 打印字典会议一个key+value的形式输出。

[dict setObject:@"jim" forKey@"name"];

[dict setObject:@"jack" forKey@"name"];

如果字典中有两个相同的Key,那么在打印后最后一个属性会覆盖掉前一个属性。

NSString *str = dict[@"name"];

NSLog(@"%@",str);

注意点

@[@"name":@"jack"];只能在不可变的Dictionary中使用 ,不能再可变Dictionary中使用。

字典的遍历

之前的方法:

NSDictionary *dir = @{

@"address":@"jack",

@"name":@"jack1",

@"name1":@"jack",

@"qq":@"13132131"

};

NSArray *Key = [dict allKeys];

for (int i = 0;i<dict.count;i++)

{

NSString *Key =Keys[i];

NSString *object = dict[key];

NSLog(@"%@ = %@",key,object);

}

开发中用block

[dict enumrateKeysAndObjectUsingBlock:

^(id key,id obj,BOOL *stop)

{

NSLog(@"%@ - %@",key,obj)

*stop = YES; 停止遍历

} ];

牛B人写法(可读性差 让别人看不懂)

NSArray *person = @[

@{@"address":@"jack"},

@{"name":@"jack1"},

@{"name1":@"jack"},

@{"qq":@"13132131"}

];

这步:NSLog(@"[@'qq]%@",person[1][@"qq"]);

先去出1位置对应的字典,再取出字典中QQ这个key对应数据。

NSNumber:

基本数据类型无法放入集合类中,包装后可以放入。怎么包装:

1 in类型 转换为NSNumber 类型

NSNumber *num = [NSNumber numberWithInt:10];

NSDictionary *dict = @{

@"name":@"jack",

@"age":num

};

NSNumber *num2 = dict(@"age");

[num2 intValue]; 转换为int类型值

2,double类型

NSNumber *n = [NSNumber numberWithDouble:10.5];

[n doubleVaule];

3,基本数据类型转为字符串类型

NSString *str = [NSString stringWithFormat:@"%d",20];

4,把字符串转为基本数据类型

NSString *str = [NSString stringWithFormat:@"%d",20];

[str intValue];

打印出来看看:

NSLog(@"%d",[str intValue]);

编译器特性:

开发中用下面的

NSArray *array = @{

@{@"name":@"jack",@"age": [NSNumber numberWithInt:26]},

@{@"name":@"jim",@"age": [NSNumber numberWithInt:28]},

@{@"name":@"rose",@"age": [NSNumber numberWithInt:25]}

}

以后:比如上面,[NSNumber numberWithInt:26]

写成@26.编译器特性,编译器会直接把@26 转换成NSNumber类型,所以上面可以写成:

}

NSArray *array = @{

@{@"name":@"jack",@"age":@26},

@{@"name":@"jim",@"age":@29},

@{@"name":@"rose",@"age":@25}

}

其他基本数据类型都可以包装成NSNumber.

将int age =10 变量包装成NSNumber类型

@(age); 如果不写小括号 @age;系统会认为是关键字 报错。

NSValue:

NSNumber 只能保证数字,不能包装结构体。

NSValue 能包装任何东西

NSNumber之所以能包装基本数据类型为对象,是因

为继承了NSValue。

CGPoint p = CGPointMake(10,10);

NSValue *value = [NSValue valueWithPoint:p];

NSArray *array =@{value};

将Value转为对应的结构体

[value pointValue];

NSDate:利用对象表示时间

创建一个时间对象

NSDate *date = [NSDate date];

打印出来的时间是0时区的时间,与北京慢了8个小时。

NSLog(@"%@",date);

从date时间 慢5秒

NSDate *date2 = [NSDate dateWithTimeInterval:5 sinceDate:date];

从1970开始走过的秒数

NSTimeTnterval seconds = [date2 timeInterval5Since1970];

从调用代码到现在的时间

[date2 timeIntervalSinceNow];

开发应用:日期格式化

NSDateFormatter *formatter = [[NSDateFormatter alloc] init];

y年 M月 d日 m分 s秒 H(24)时 h(12)时

formatter.dateFormat = @"yyyy-MM-dd HH:mm:ss"

NSString *str = [formatter stringFromDate:date];

NSLog(@"% @",str);

把字符串转化为NSDate

NSString *time = @"2011/09/10 19:60";

NSDateFormatter *formatter = [[NSDateFormatter alloc]init];

formatter.dateFormat = @"yyyy/MM/dd HH:mm"

NSDate *date=[formatter dateFromString:time];

NSLog(@"%d",date);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: