oc基础知识

来源:互联网 发布:免费的数据库管理软件 编辑:程序博客网 时间:2024/05/29 16:20
              基础知识(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(@"
%@",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);

 

 

 

 

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 哪些人不适合吃消遥丸 哪些人不宜使用香砂和胃丸 哪些人不适合用木香顺气丸 补脾益肠丸不适合什么人吃 龙胆泄肝丸不适用那些人 什么人不能吃五子洐宗丸 大活络丸哪些人不能吃 骨化三醇胶丸适合适合什么人 什么人不宜吃麝香保心丸 天王补心丸不适合什么人吃 人参保肺丸 香砂养胃丸不适合什么人吃 香砂六君子丸不适合哪些人 补脾益肠丸适合什么人吃 藿香正气丸什么人不能吃 安神补心丸适合哪些人吃 什么人不适合吃柏子养心丸 木香顺气丸不适合哪些人吃 泰国蜈蚣丸哪些人禁用 小活络丸哪些人不能用 2陈丸哪种人不能吃 大补阴丸适合什么人吃 黑芝麻丸不适合什么人吃 清心丸适合什么人吃 安宫丸什么人不能吃 兰丸多人上受 舒肝健胃丸不适合什么人吃 丹栀逍遥丸适合哪些人 人丹 什么人不适合吃红毛丹 哪些人不适合吃香丹清 丹叁粉哪种人不能吃 丹栀逍遥丸什么人不能吃 百消丹不适用于什么人 哪些人不能吃摩罗丹 环阳丹医生江涛是何许人 丹人修仙之仙界篇 全家人的丹尼斯供应商 全家人的丹尼斯大卖场供应商 艳鼎丹仙 那时那人 什么人不能吃天王补心丹