美文网首页iOS开发之笔记摘录
OC基础快速恢复1(含控制语句/数据类型)

OC基础快速恢复1(含控制语句/数据类型)

作者: 平安喜乐698 | 来源:发表于2017-11-16 18:34 被阅读8594次
    目录
        1. 语法特性
        2. 控制语句
        3. 数据结构
        4. 数据类型
    
    1.语法特性
    OC:面向对象
    
    封装
        将所有东西都封装为类(方便复用)
    继承
        子类继承父类的所有属性和方法(减少冗余)
    多态
        动态运行时语言(方便复用)
            动态类型(只有在运行时才能确定对象的类型,如id修饰的对象/父类指针传入子类对象。RunTime机制可以动态替换或添加方法)
            动态绑定(对象的类型确定后,其所对应的属性和方法就确定了)
            动态加载(在运行时根据需要加载所需资源:如@2x@3x图片)
    
    2. 控制语句
                          同Java同C  都是以C为基础
    

    2.1. 判断语句

    if判断 
        判断条件---非0则真(1)  为真则真(@"sb"!= nil)  非假则真( !0 )
        if(i==1){
        }else if(i==2){
        }else{
        }
    switch判断
        当条件多于3个时使用switch
        switch(x){        // 只能是整型、char
            case 1:{
                // 多个语句时必须加{},否则报错
                break;
            }
            default:
        }
    

    2.2 循环语句

    for循环
        for(int i=0;i<10;i++){        // 1可省(写在上面) 3可省(写在里面)
        }
        for(id item in array){
        }
        for(id key in dict.allKeys){
            dict[key]
        }
        for(id value in dict.allValues){
        }
    where循环
        while(i<10){
        }
        do{
        }while(i<10);
    
    break;        跳出循环
    continue;     跳出本次循环,开始下次循环
    
    3. 数据结构
        数据结构:计算机组织存储数据的方式。
    
        数据之间的相互关系称为结构,分为逻辑结构和物理结构。
          逻辑结构:
              集合结构(所有数据的数据类型相同)、
              线性结构(一对一)、
              树性结构(一对多)、
              图像结构(多对多)    
          物理结构:
              栈(由编译器自动管理)、
              堆(需要手动创建并管理,容易造成内存泄漏)、  
              队列、  
              链表(数据在内存中是不连续的,通过节点中的指针联系在一块)、
              数组(数据在内存中是连续的,每个元素所占内存相同,可通过下标迅速访问)
    
    内存的分区情况:
                代码区(存放程序代码)
                数据区(存放常量、全局变量、静态变量)
                堆区(由程序员手动申请并释放)
                栈区(由编译器管理,局部变量、函数参数)
    
    4.数据类型
    分为
      基本数据类型
      枚举、结构体、类类型
    
    4.1.基本数据类型
    int(默认值为0)
    float
    double
    char
    BOOL(默认:false,非0则真 , !真则假)
    NSInteger
    
    4.2.枚举
    将有限个相关值合在一起
    
    typedef enum{                       // 定义+取别名
        TypeA=0,
        TypeB,
    }Type;
    Type type=TypeA;
    enum Type{                          // 定义
        TypeA=0,
        TypeB,
    };
    enum Type type=TypeA;
    
    4.3. 结构体
    不能封装行为
    
    struct Person{                          // 定义
        char *name;
        int age;
    };
    typedef struct Person MyPerson;         // 取别名
    
    typedef struct{                 // 定义+取别名
        char *name;
        int age;
    }MyPerson;
    
    //
    MyPerson person={"xiaoming",15};        
    struct Person person={"xiaoming",15};  
    //
    person.name="xiaozhang";
    person.age=21;
    //
    struct Person *person1=&person;
    person1->name="xiaozhang";                  // 不能使用 .
    person1->age=21;
    
    4.4 类类型
    系统类类型
      非集合类
        NSNumer(基础数据类型互转对象类型)(例:@15,  [num integerValue])
        NSString、NSMutableString
      集合类
        NSArray、NSMutableArray           (只能存储对象类型)
        NSDictionary、NSMutableDictionary     (只能存储对象类型)
        NSSet
    自定义类类型
      自定义类名 继承:NSObject
    
      NSObject-所有对象类型的基类
      id可以是任意类类型(OC动态运行时语言:只有在运行时才能确定变量的类型)(id a=dog 没有*,id自带*)
      父类 *f=子实例;  [f 子独有方法];  编译时不会报错,运行时崩
    
    1. 系统类类型
    NSString    
    
    创建方式
            NSString *contentStr=@"";
            NSString *contentStr=[NSString stringWithString:@""];
            NSString *contentStr=[NSString stringWithFormat:@"%@",@""];
            NSString *contentStr=[[NSString alloc]initWithFormat:@"%@",@""];
    
    改
            // 追加字符串(生成的是新的字符串)
            NSString *newStr=[contentStr stringByAppendingString:@""];
            NSString *newStr=[contentStr stringByAppendingFormat:@"%@",@""];
            // 截取字符串
            [contentStr substringFromIndex:0];
            [contentStr substringWithRange:NSMakeRange(0, 10)];
            [contentStr substringToIndex:10];
            // 字符串->array
            NSArray *arr=[contentStr componentsSeparatedByString:@","];
            // 转大小写
            NSString *upStr=[contentStr uppercaseString];
            NSString *lowStr=[contentStr lowercaseString];
    
    查
            // 字符串的长度
            NSUInteger length=contentStr.length;
            // 字符串某位置的字符
            unichar xChar=[contentStr characterAtIndex:0];
            // 字符串是否相等
            [contentStr isEqualToString:@"ddd"]         
            // 某字符串的range
            NSRange range=[contentStr rangeOfString:@"xx"];
            // 是否不包含字符串xx
            [contentStr rangeOfString:@"xx"].location == NSNotFound 
            // 是否包含某字符串xx
            BOOL isHave=[contentStr containsString:@"xx"];
            // 是否有 前缀xx/后缀xx
            [contentStr hasPrefix:@"xx"];
            [contentStr hasSuffix:@"xx"];
            // 共同的前缀
            [contentStr commonPrefixWithString:@"xx123" options:NSLiteralSearch];
    
    
    
    NSMutableString  : NSString
    
            // 创建
            NSMutableString *muStr=[NSMutableString stringWithString:@""];
            NSMutableString *muStr=[NSMutableString stringWithFormat:@"%@",@""];
            NSMutableString *muStr=[NSMutableString stringWithCapacity:10];
      
            // 插入
            [muStr insertString:@"" atIndex:0];
            // 删除
            [muStr deleteCharactersInRange:NSMakeRange(0, 10)];
            // 追加
            [muStr appendString:@""];
            [muStr appendFormat:@"%@",@""];
    
    NSArray
    
            // 创建
            NSArray *arr1 = [[NSArray alloc] initWithObjects:@"a", @"b", @"c", nil];
            NSArray *arr11= [[NSArray alloc] initWithArray:arr1];
            NSArray *arr12= [[NSArray alloc] arrayWithArray:arr1];
            NSArray *arr2 = [NSArray arrayWithObjects:@"a", @"b", @"c", nil];   // 类方法
            NSArray *arr3 = @[@"a", @"b", @“c”,@1,@YES];        // 元素不可nil,否则崩
    
    改    
            // 追加(生成新数组)
            NSArray *newArr=[arr arrayByAddingObjectsFromArray:@[]];
            NSArray *newArr=[arr arrayByAddingObject:@""];
            // 是否包含某元素
            BOOL isHave=[arr containsObject:@""];
            // array->str
            NSString *str=[arr componentsJoinedByString:@","];
    
    查
            arr.count
            [arr count]
            arr[0]
            [arr firstObject]
            [arr lastObject]
    
    
    NSMutableArray
    
    创建
            NSMutableArray *mutArr = [@[@"a", @"b", @"c"] mutableCopy];     // 转mutable
            NSMutableArray *mutArr = [[NSMutableArrary alloc]initWithCapacity:10];  // 预存放大小
            NSMutableArray *mutArr = [[NSMutableArray alloc]init];
            NSMutableArray *mutArr = [NSMutableArray array];
            NSMutableArray *mutArr = [[NSMutableArray alloc]initWithObjects:@“”,@“”,nil];
            NSMutableArray *mutArr = [NSMutableArray arrayWithObjects:@“”,@“”,nil];
            NSMutableArray *mutArr = [[NSMutableArray alloc]initWithArray:arr1];
            NSMutableArray *mutArr = [NSMutableArray arrayWithArray:arr1];
    
    改
            // 增
            [mutArr addObject:@“12”];
            [mutArr addObjectsFromArray:@[@"",@""]];
            [mutArr insertObjectAtIndex:0];
            [mutArr insertObjects:@[@"",@""] atIndexes:[NSIndexSet indexSetWithIndex:0]];
            // 删
            [mutArr removeObject:@“12”];
            [mutArr removeObjectAtIndex:0];
            [mutArr removeObjectsAtIndexes:[NSIndexSet indexSetWithIndex:0]];
            [mutArr removeObjectsInRange:NSMakeRange(1,1)]; // 从1删长度1
            [mutArr removeObject:@"xx" inRange:NSMakeRange(0, 10)];
            [mutArr removeObjectsInArray:@[@"",@""]];
            [mutArr removeLastObject];
            [mutArr removeFirstObject];
            [mutArr removeAllObjects];
            // 换
            [mutArr exchangeObjectAtIndex:0 withObjectAtIndex:1];
            [mutArr replaceObjectAtIndex:0 withObject:@""];
            [mutArr replaceObjectsAtIndexes:[NSIndexSet indexSetWithIndex:0] withObjects:@[@"",@""]];
            [mutArr replaceObjectsInRange:NSMakeRange(0, 10) withObjectsFromArray:@[@"",@""]];
            [mutArr replaceObjectsInRange:NSMakeRange(0, 10) withObjectsFromArray:@[@"",@""] range:NSMakeRange(0, 1)];
    
    查       
            id item=[mutArr objectAtIndex:0];
            NSInteger index=[mutArr indexOfObject:item];
            id item=[mutArr firstObject];       
            id lastItem=[mutArr lastObject];
            BOOL isHave=[mutArr contatinsObject:@“”];
            
            for (int i=0;i<[mutArr count];i++){         // for循环 
            }
    
    NSDictionary
    
            // 创建
            NSDictionary *dict1 = [NSDictionary dictionaryWithObjectsAndKeys:@"vA", @"kA",@"vB", @"kB",nil];
            NSDictionary *dict2 = [[NSDictionary alloc] initWithObjectsAndKeys:@"vA", @"kA",@"vB", @"kB",nil];
            NSDictionary *dict3 = @{@"kA":@"vA",@"kB":@"vB"};   // 元素不可nil,否则崩
            NSDictionary *dict4 = [[NSDictionary alloc] initWithDictionary:dict1];
    
            // data->dict   
            NSDictionary *dict=[NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil];
            // dict->data
            NSData *data=[NSJSONSerialization dataWithJSONObject:dict NSJSONWritingPrettyPrinted error:nil];
            id object=dict1[@"key"];
            id object=[dict1 objectForKey:@"key"];
            NSArray *allKeys=[dict1 allKeys];
            NSArray *allValues=[dict1 allValues];
    
    
    
    NSMutableDictionary
    
            NSMutableDictionary *dict5 = [[NSMutableDictionary alloc] init];
            NSMutableDictionary *dict6 = [[NSMutableDictionary alloc] initWithDictionary:dict1];
            NSMutableDictionary *dict7 = [[NSMutableDictionary alloc] initWithObjectsAndKeys:@"vA", @"kA",@"vB", @"kB",nil];
    
            [dict4 setObject:@"" forKey:@""];
            [dict4 removeObjectForKey:@""]; 
    
    NSSet(几乎不用)
             NSSet *set=[[NSSet alloc]initWithObjects:@“”,@“”,nil];
             NSSet *set=[[NSSet setWithObjects:@“”,@“”,nil];
    
    
    NSCharacterSet(用于分割字符串、中文编码)
             // 分割字符串
             NSCharacterSet *cSet=[NSCharacterSet characterSetWithCharactersInString:@“#$%”];
             NSString *str=@“ddddd#fff%fff$dd”;
             NSArray *arr=[str componentsSeperatedByCharactersInSet:cSet];      
    
             // url中文编码
             NSCharacterSet *set2=[NSCharacterSet URLFragmentAllowedCharacterSet];
             [str stringByAddingPercentEncodingWithAllowedCharacters:set2];
    
    1. 自定义类
    使用Dog类
        // 新建一个对象
        Dog *dog=[[Dog alloc] init];    
    
        // 使用该对象的属性/方法
        dog.dogName                         // 位于=左侧则是设置值(调用set方法)  ,  位于=右侧则是获取值(调用get方法)
        [dog run];
    
    自定义Dog类
    
    // 接口.h文件(用于外部调用)
    @interface Dog:NSObject{
        NSString *_dogName;                             // 属性用{}与方法分开,不能在setDogName:方法中用self.(本质是调用setDogName:)造成循环调用,可以在其他方法中用self. , 但为了统一格式:统一用  _变量名(声明是 调用亦是)
    }
    -(void)run;                                         // 实例方法
    -(void)run:(int)count;                              // 实例方法(带参)
    -(void)run:(int)count withLength:(int)length;       // 实例方法(带多参)
    +(int)Legs;                                         // 类方法
    @end
    
    
    // 实现.m文件(具体实现)
    @implementation Dog
    static NSString *const kM = @"sb";  // static修饰全局变量时表示:只在本类内部使用 const修饰常量(const修饰“右边”  const *kM 则表示指向不可变 内容可变   * const kM 则表示kM及内容不可变 *kM即指向可变)
    -(void)run{}
    -(void)run:(int)count{}
    -(void)run:(int)count withLength:(int)length{}
    +(int)Legs{
        return 4;
    }
    @end
    

    协议

    1.协议
    
    @protocol MyDelegate<NSObject>
    @required
    @optional
    -(void)run;
    @end
    
    2. A类 dele属性
    
    @property(nonatomic,weak) id<MyDelegate> delegate;
    需要的地方 [self.dele 方法];
    
    3. B类 遵守协议
    
    B类名<协议>
    实现协议方法
    
    @class 类名       // 声明有此类
    .h中用@class声明要用到的其他类,.m中再#import ""  (可减少编译时间)
    
    
    
    
        self.属性: 会首先调用set/get方法   (兼容懒加载,统一格式)
        _属性:会直接访问属性值
    
    
    == 比较指针
    
    
    instancetype:代表本类型(仅用于本类)
    -(instancetype)init(){
        self=[super init]
        if(self){       
        }
        return self
    }
    
    
    C:
    [函数] 调用在实现之前,要进行声明
    声明:  返回类型 函数名(参数类型 参数名);
    实现:  返回类型 函数名(参数类型 参数名){}
    调用:  int x=函数名(参值);
    
    5. 其他小知识
    所有数据类型要用()括起来
    
    
    类型转换(强转)
        (UIImageView*)view  (NSNumber*)@"123"
        浮点型+整型==浮点型(可直接操作,精度为最大的那个,当函数要求返回类型为低精度时直接转)
    
    
    不支持函数重载(JAVA C++支持)
    
    1. typedef
    typedef重定义数据类型---给类型取别名
    
        // 用MyInt代替int(安全)
        typedef int MyInt;
    
        // 枚举(Type typeA)
        typedef enum{                       
          TypeA=0,
          TypeB,
        }Type;
    
        // struct (MyPerson person)
        typedef struct Person{                  
            char *name;
            int age;
        }MyPerson;
    
        // block (MyBlock myBlock)
        typedef void (^MyBlock)(NSString *content);
    
        // C函数
        typede void (*MyMehod)(char *content)
        // C数组 
        typedef int (*Arr)[10];
    
    为复杂声明取别名
    1.
        举例:void (*xxx[10]) (void (*)());
        解:typedef void (*VoidFun)();
                typedef void (*Fun)(VoidFun);
        答:Fun xxx[10];    
    2.
        举例:doube(*)() (*xxx)[9];
        解:typedef doube(*VoidFun)();
                typedef VoidFun (*Point)[9];
        答:Point xxx; 
        小记:[] 优先级高于*
    
    
    注意:
    1.
          const int *a=10;
          a++;
          正确
          typedef int* YTInt;
          const YTInt a=3;
          a++;
          报错
    原因:将YTInt整体作为数据类型,const直接修饰了a,导致a不可变,*a可变。
    
    1. "重载"
    JAVA(C++同理)
        public interface Person{
        }
        public class Student implements Person{
        }
        public class Adult implements Person{
        }
        public class Run{
            public void read(Person person){
                System.out.println("person read");
            }
            public void read(Student person){
                System.out.println("Student read");
            }
            public void read(Adult person){
                System.out.println("Adult read");
            }
        }
        
    Person person=new Student();
    Read readM=newRead();
    readM.read(person);
    会输出person read,不是想要的结果。直接作为参数放进去,不会识别,调用方法可识别(因此给person加一个方法---readM作为参数传入,在添加的方法中调用read方法),这样一来就先识别了类。
    
    
    解决:
    添加方法
        public interface Person{
            public void goRead(Read read);
        }
        public class Student implements Person{
            public void read(Read read){
                read.read(this);
            }
        }
        public class Adult implements Person{
            public void read(Read read){
                read.read(this);
            }
        }
    Person person=new Studnt();
    Read read=newRead();
    person.goRead(read);    
    
    OC不支持重载
    
    // 利用SEL可实现“重载”
    SEL selector = NSSelectorFromString(@"");
    if ([self respondsToSelector:selector]) {
        [self performSelector:selector withObject:@"参数对象"];    
    }
    
    1. main.m 程序主入口
    // 包含系统基础库
    #import <Foundation/Foundation.h>
    
    // 主函数(程序入口)
    int main(int argc, const char * argv[]) {
        // 自动释放池(内存管理方式之一)
        @autoreleasepool {
            // 打印
            NSLog(@"Hello, World!");        // ; 语句分隔符(所有语句)
            NSLog(@"%@",@"字符串");
        }
        return 0;
    }
    
    #import <UIKit/UIKit.h>
    #import "AppDelegate.h"
    
    int main(int argc, char * argv[]) {
        @autoreleasepool {
    
            // 创建一个UIApplication对象,和AppDelegate对象(遵守<UIApplicationDelegate> )       
            // 第3个参数等价于:[UIApplication class](也可以是其子类)  第4个参数:遵守<UIApplicationDelegate> 的一个类
            return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
        }
    }
    

    相关文章

      网友评论

        本文标题:OC基础快速恢复1(含控制语句/数据类型)

        本文链接:https://www.haomeiwen.com/subject/tgkrvxtx.html