Objective C 基础01

基本数据类型

Objective C 基础01_第1张图片

协议protocol

在ObjC中使用@protocol定义一组方法规范,实现此协议的类必须实现对应的方法。熟悉面向对象的童鞋都知道接口本身是对象行为描述的协议规范。

Fundation框架


一、什么是Cocoa

Cocoa不是一种编程语言(它可以运行多种编程语言),它也不是一个开发工具(通过命令行我们仍然可以开发Cocoa程序),它是创建Mac OS X和IOS程序的原生面向对象API,为这两者应用提供了编程环境。

我们通常称为“Cocoa框架”,事实上Cocoa本身是一个框架的集合,它包含了众多子框架,其中最重要的要数“Foundation”和“UIKit”。前者是框架的基础,和界面无关,其中包含了大量常用的API;后者是基础的UI类库,以后我们在IOS开发中会经常用到。这两个框架在系统中的位置如下图:

Objective C 基础01_第2张图片
Cocoa框架

二、NSObject

所有的Mac OS X和IOS程序都是由大量的对象构成,而这些对象的根对象都是NSObject,NSObject就处在Foundation框架之中。通常我们会将他们分为几类:

  1. 值对象
  2. 集合
  3. 操作系统服务:文件系统、URL、进程通讯
  4. 通知
  5. 归档和序列化
  6. 表达式和条件判断
  7. Objective-C语言服务

三、常用结构体:NSRange、NSPoint、NSSize、NSRect等

常用结构体在Foundation框架中都有一个对应的make方法进行创建,这也是我们日后比较常用的操作;而且与之对应的还都有一个NSStringFromXX方法来进行字符串转换,方便我们调试。下面提到NSSize其实就是CGSize,NSRect其实就是CGRect.

  1. NSRange 表示一个范围

    • 定义: NSRange rg = {3, 5};
    • Make定义 NSRange rg = NSMakeRange(3,5);
    • 第一参数是起始位置第二个参数是长度: rg.location = 3; rg.length = 5;
  2. NSPoint 表示Cartesian坐标系中的一个点,typedef CGPoint NSPoint;

    • Make定义 NSPoint p = NSMakePoint(10, 15);
    • 或者使用CG方法定义 NSPoint p2 = CGPointMake(10, 15);
    • 两个参数分别表示x轴和y轴 p1.x = 10; p1.y = 15
  3. NSSize 表示一个二维的size, typedef CGSize NSSize;

    • 定义方法同上
    • NSSize s = NSMakeSize(10, 15);CGSize s2 = CGSizeMake(10, 15);
    • 两个参数width, height, s.width = 10; s.height = 15;
  4. NSRect 表示一个矩形, typedef CGRect NSRect;

    • 定义方法同上
    • NSRect r = NSMakeRect(10,5,100,200); NSRect r2 = CGRectMake(10,5,100,200);
    • 两个参数分别为NSPoint型的origin和NSSize型的size

四、日期:NSDate,NSTimeInterval,NSDateFormatter

Symbols

  • date 新建并返回一个新的日期
    NSDate *today = [NSDate date];//获得当前日期
  • dateWithTimeIntervalSinceNow: 创建并返回一个距离当前日期秒数的NSDate对象
    +(instancetype)dateWithTimeIntervalSinceNow:(NSTimeInterval)secs;//方法
    NSDate *date2=[NSDate dateWithTimeIntervalSinceNow:100];//在当前日期的基础上加上100秒
  • distantFuture 随机获取一个未来日期
    NSDate *date3=[NSDate distantFuture];

五、字符串

  1. 不可变字符串NSString
  • 字符串定义
    1) char *str1="C string";
    2) NSString *str2=@"OC string";//ObjC字符串需要加@,并且这种方式创建的对象不需要自己释放内存
    //下面的创建方法都应该释放内存
    3) NSString *str3=[[NSString alloc] init]; str3=@"OC string";
    4) NSString *str4=[[NSString alloc] initWithString:@"Objective-C string"];
    5) NSString *str5=[[NSString alloc] initWithFormat:@"age is %i,name is %.2f",19,1.72f];
    6) NSString *str6=[[NSString alloc] initWithUTF8String:"C string"];//C语言的字符串转换为ObjC字符串
    //以上方法都有对应静态方法(一般以string开头),不需要管理内存(系统静态方法一般都是自动释放)
    7) NSString *str7=[NSString stringWithString:@"Objective-C string"];

  • NSString对象的方法
    NSString str1 = @"Hello world!";
    //uppercaseString,大写
    NSLog(@"%@",[str1 uppercaseString]);//结果: HELLO WORLD!
    //lowercaseString,小写
    NSLog(@"%@",[str1 lowercaseString]);//结果: hello world!
    //capitalizedString首字母大写,其他字母小写
    NSLog(@"%@",[str1 capitalizedString]);//结果:Hello World!
    //isEqualToString: 两字符串是否相等
    BOOL result= [@"abc" isEqualToString:@"aBc"];//结果:result=false
    //hasPrefix: 前缀
    NSLog(@"%i",[str hasPrefix:@"He"]);// result:1
    //hasSuffix: 后缀
    NSLog(@"%i",[str1 hasSuffix:@"ld!"]);//result:1
    //intValue 类型转换
    NSLog(@"%i",[@"12" intValue]);//result: 12
    //length 字符串长度
    NSLog(@"%zi",[@"hello world,世界你好!" length]);//结果:17
    //characterAtIndex:取出单个字符
    NSLog(@"%c",[@"abc" characterAtIndex:0]);//取出制定位置的字符,结果:a

  1. 可变数组NSMutableString

    • 字符串定义
      NSMutableString *str1= [[NSMutableString alloc] initWithCapacity:10];
      [str1 setString:@"hello"];//设置字符串

    • 方法
      1) setString 设置
      [str1 setString:@"hello"];//设置字符串
      2) appendString 追加
      [str1 appendString:@",world!"];//追加字符串,结果:hello,world!
      3) appendFormat 格式化追加
      [str1 appendFormat:@"我的年龄是%i。dear,I love you.",18];
      4) replaceCharactersInRange:NSRange withString:NSString 替换
      NSRange range=[str1 rangeOfString:@"dear"];
      [str1 replaceCharactersInRange:range withString:@"Honey"];
      5) insertString:NSString atIndex: NSNumber插入字符串
      [str1 insertString:@"My name is Kenshin." atIndex:12];
      6) deleteCharactersInRange:NSRange 删除指定字符串
      [str1 deleteCharactersInRange:[str1 rangeOfString:@"My name is Kenshin."]];

六、数组

  1. 不可变数组NSArray

    • 定义

      //NSArray长度不可变所以初始化的时候就赋值,并且最后以nil结尾
      1) NSArray *array1 = [[NSArray alloc] initWithObjects:@"abc",obj,@"cde",@"opq", nil];
      2) NSArray *array1 = [NSArray arrayWithObjects:@"abc",obj,@"cde",@"opq",@25, nil];
      3) NSArray *array2 = @[@"abc",obj,@"cde",@"opq",@25];
         >#注意这里用@[]直接初始化数组,而直接初始化字典用@{},注意区分!!
      
    • 属性和方法

       1) count : NSLog(@"%zi",array1.count);//数组长度,结果:5
      #containsObject:
       2) NSLog(@"%i",[array1 containsObject:@"cde"]);//是否包含某个对象,结果:1
      #lastObject
       3) NSLog(@"%@",[array1 lastObject]);//最后一个对象,结果:25
      # indexOfObject:
       4) NSLog(@"%zi",[array1 indexOfObject:@"abc"]);//对象所在的位置:0
      
    • 数组遍历(待续.....)

    • 数组排序

      • 方法1,使用自带的比较器
        NSArray *array=[NSArray arrayWithObjects:@"3",@"1",@"2", nil];
        NSArray *array2= [array sortedArrayUsingSelector:@selector(compare:)];
      • 方法2,(待续。。。)
  • 注意
    • NSArray中只能存放对象,不能存放基本数据类型,通常我们可以通过在基本数据类型前加@进行转换;
    • 数组中的元素后面必须加nil以表示数据结束;
    • 上面数组操作中无论是数组的追加、删除、截取都没有改变原来的数组,只是产生了新的数组而已;
    • 对象的比较除了使用系统自带的方法,我们可以通过自定义比较器的方法来实现;
  1. 可变数组NSMutabelArray
  • 定义

      Person *person1=[Person personWithName:@"Kenshin"];
      Person *person2=[Person personWithName:@"Kaoru"];
      Person *person3=[Person personWithName:@"Rosa"]; 
      NSMutableArray *array1=[NSMutableArray arrayWithObjects:person1,person2,person3, nil];
    
  • 属性和方法

     Person *person4=[Person personWithName:@"Jack"];//此时person4的retainCount为1
     #addObject: 添加一个对象元素
     [array1 addObject:person4];//添加一个元素,此时person4的retainCount为2
     #removeObject:
     [array1 removeObject:person3];//删除一个元素
     #removeLastObject
     [array1 removeLastObject];//删除最后一个元素
     #removeAllObjects
     [array1 removeAllObjects];//删除所以元素
     //注意当往数组中添加一个元素时会retain因此计数器+1,当从数组中移除一个元素时会release因此计数器-1  
     //当NSMutalbeArray对象release的时候会依次调用每一个对象的release
    

七、字典

  • 初始化

    #dictionaryWithObject
    NSDictionary *dic1=[NSDictionary dictionaryWithObject:@"1" forKey:@"a"];
    #dictionaryWithObjectsAndKeys
    NSDictionary *dic2=[NSDictionary dictionaryWithObjectsAndKeys:
                      @"1",@"a",
                      @"2",@"b",
                      @"3",@"c",
                      nil];
    #dictionaryWithObjects:NSArray forKeys:NSArray
    NSDictionary * dic3=[NSDictionary dictionaryWithObjects:[NSArray arrayWithObjects:@"1",@"2", nil] forKeys:[NSArray arrayWithObjects:@"a",@"b", nil]];    
    #更简单的方式
    NSDictionary *dic4=@{@"1":@"a",@"2":@"b",@"3":@"c"};
    
  • 方法

    NSDictionary *dic1=[NSDictionary dictionaryWithObjectsAndKeys:
                      @"1",@"a",
                      @"2",@"b",
                      @"3",@"c",
                      @"2",@"d",
                      nil];
    # count
    NSLog(@"%zi",[dic1 count]); //结果:4
    # valueForKey:
    NSLog(@"%@",[dic1 valueForKey:@"b"]);//根据键取得值,结果:2
    #[]直接引用建
    NSLog(@"%@",dic1[@"b"]);//还可以这样读取,结果:2
    #allKeys, allValues
    NSLog(@"%@,%@",[dic1 allKeys],[dic1 allValues]); 
    #removeObjectForKey: 删除一个元素
    [dic1 removeObjectForKey:@"b"];
    #addEntriesFromDictionary: 添加元素
    [dic1 addEntriesFromDictionary:@{@"e":@"7",@"f":@"6"}];
    #setValue 重新设置键值
    [dic setValue:@"5" forKey:@"a"];
    
  • 遍历

    • 方法1: for key in dic =>key, [dic objectForKey:key]
      for (id key in dic1) { //注意对于字典for遍历循环的是key
      NSLog(@"%@=%@",key,[dic1 objectForKey:key]);
      }

    • 方法2: 使用迭代器
      NSEnumerator *enumerator=[dic1 keyEnumerator];
      id key=nil;
      while (key=[enumerator nextObject]) {
      NSLog(@"%@=%@",key,[dic1 objectForKey:key]);
      }

    • 方法3: 使用代码块
      [dic1 enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
      NSLog(@"%@=%@",key,obj);
      }];

八、拆箱和装箱

  1. 简介

数组和字典中只能存储对象类型,其他基本类型和结构体是没有办法放到数组和字典中的。当然你也是无法给它们发送消息的(也就是说有些NSObject的方法是无法调用的),这个时候通常会用到装箱(boxing)和拆箱(unboxing)。其实各种高级语言基本上都有装箱和拆箱的过程,例如C#中我们将基本数据类型转化为Object就是一个装箱的过程,将这个Object对象转换为基本数据类型的过程就是拆箱,而且在C#中装箱的过程可以自动完成,基本数据类型可以直接赋值给Object对象。但是在ObjC中装箱的过程必须手动实现,ObjC不支持自动装箱。在ObjC中我们一般将基本数据类型装箱成NSNumber类型(当然它也是NSObject的子类,但是NSNumber不能对结构体装箱),调用其对应的方法进行转换。
  • 装箱方法

      +(NSNumber *)numberWithChar:(char)value;
      +(NSNumber *)numberWithInt:(int)value;
      +(NSNumber *)numberWithFloat:(float)value;
      +(NSNumber *)numberWithDouble:(double)value;
      +(NSNumber *)numberWithBool:(BOOL)value;
      +(NSNumber *)numberWithInteger:(NSInteger)value;
    
  • 拆箱方法

      -(char)charValue;
      -(int)intValue;
      -(float)floatValue;
      -(double)doubleValue;
      -(BOOL)boolValue;
    

1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1

你可能感兴趣的:(Objective C 基础01)