iOS基础之OC

目录
    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;

方式二

推荐使用---混编时不报错

typedef NS_ENUM(NSInteger,TYPE){
    TYPE_ADD,
    TYPE_SUB,
};
typedef NS_OPTIONS(NSInteger, TYPE){
    TYPE_ADD = 1 << 0,  // 2的0次方
    TYPE_SUB = 1 << 1,  // 2的1次方
};

@property (nonatomic,assign) TYPE type;

有 << 则可以使用 | (如:TYPE_ADD|TYPE_SUB)

int type=TYPE_ADD|TYPE_SUB  type&TYPE_ADD为TYPE_ADD的值则有TYPE_ADD


原理:
int value = TYPE_ADD | TYPE_SUB;
转成二进制:
TYPE_ADD: 0 0 0 1
|
TYPE_SUB: 0 0 1 0
----------------
value: 0 0 1 1
上面是使用 | 得出value的值为0011  (|的意思是有一个为1结果就为1)


下面是使用 & 判断输出的值(&的意思就是有二个为1结果才为1)
value: 0 0 1 1         value: 0 0 1 1
&                      &
nameA: 0 0 0 1         nameB: 0 0 1 0
----------------       ----------------
结果值: 0 0 0 1         结果值: 0 0 1 0
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
    NSDate
  集合类
    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:@""];

        // array->str
        NSString *str=[arr componentsJoinedByString:@","];
查
        arr.count
        [arr count]
        arr[0]
        [arr firstObject]
        [arr lastObject]

        // 是否包含某元素
        BOOL isHave=[arr containsObject:@""];

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 
        // 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];

NSDate

    // 根据时间戳(毫秒  /1000=秒)
    NSDate *date=[[NSDate alloc]initWithTimeIntervalSince1970:time/1000];

    // 格式类
    NSDateFormatter *format=[NSDateFormatter new];
    // 格式
    [format setDateFormat:@"yyyy/MM/dd HH:mm:ss"];   // 自定义 HH为24小时制,hh为12小时制
    // date转str
    NSString *timeS=[format stringFromDate:date];


    // str转date
    NSDate *date = [format dateFromString:@"2010/09/09 13:14:56"]; 
// 获取当前时间
NSDate *date = [NSDate date];

// 当前时间5s后
NSDate *date = [NSDate dateWithTimeIntervalSinceNow:5];

// 从1970-1-1 00:00:00 开始1000s
NSDate *date=[[NSDate alloc]initWithTimeIntervalSince1970:1000];

//  从1970-1-1 00:00:00 的秒数
NSTimeInterval interval = [date timeIntervalSince1970]; 

// 返回旧 新
NSDate *firstDate=[date1 earlierDate:date2];
NSDate *lastDate=[date1 laterDate:date2];

// 2个date的时间差
NSTimeInterval interval=[date1 timeIntervalSinceDate date2];

// date1加秒数 得到date2
NSDate *date2 = [date1 dateByAddingTimeInterval:60];
根据字符串 返回星期几

/**
 参数:时间字符串,格式
 返回:@"星期几"
 */
+(NSString *)getWeekdayWithDateStr:(NSString *)dateStr withFormatStr:(NSString *)formatStr{

    //
    NSArray *weekdayArr=@[@"星期日",@"星期一",@"星期二",@"星期三",@"星期四",@"星期五",@"星期六"];
    
    // 日历(NSCalendarIdentifierGregorian)
    NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
    // date
    NSDateFormatter *dateFormat=[NSDateFormatter new];
    [dateFormat setDateFormat:formatStr];
    NSDate *date=[dateFormat dateFromString:dateStr];
    // comps
    NSDateComponents *comps=[calendar components:NSCalendarUnitWeekday fromDate:date];
    

    return weekdayArr[[comps weekday]];
}
  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
5. 关键字

nullable nonnull

    只可以修饰类类型
    nullable    :可以为nil(默认)
    nonnull     :不可以为nil

属性
@property (nonatomic,strong,nonnull) NSArray *muArr;
@property (nonatomic,strong) NSArray * __nonnull muArra;
@property (nonatomic,strong) NSArray * _Nonnull muArray;

方法
-(void)func:(nonnull NSString *)str{}
-(void)funct:(NSString * _Nonnull)str{}
-(void)functi:(NSString *__nonnull)str{}
iOS基础之OC_第1张图片
对于属性的作用:有个提示
对于方法的作用:有个警告提示

NS_ASSUME_NONNULL_BEGIN
NS_ASSUME_NONNULL_END
null_resettable
_Null_unspecified
__kindof

6. 泛型
@property (nonatomic,strong) NSMutableArray *muArr;

从数组中取出的元素可以直接使用其属性或方法
iOS基础之OC_第2张图片
添错类型有警告提示,添加时有提示
7. 协议delegate
1.协议

@protocol MyDelegate
@required
@optional
-(void)run;
@end
2. A类 dele属性

@property(nonatomic,weak) id delegate;
需要的地方 判断dele是否有方法后执行[self.dele 方法];
3. B类 遵守协议

B类名<协议>
实现协议方法
110. 其他小知识
@class 类名       // 声明有此类
.h中用@class声明要用到的其他类,.m中再#import ""  (可减少编译时间)




    self.属性: 会首先调用set/get方法   (兼容懒加载,统一格式)
    _属性:会直接访问属性值


== 比较指针


instancetype:代表本类型(仅用于本类)
-(instancetype)init(){
    self=[super init]
    if(self){       
    }
    return self
}


C:
[函数] 调用在实现之前,要进行声明
声明:  返回类型 函数名(参数类型 参数名);
实现:  返回类型 函数名(参数类型 参数名){}
调用:  int x=函数名(参值);
所有数据类型要用()括起来


类型转换(强转)
    (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 

// 主函数(程序入口)
int main(int argc, const char * argv[]) {
    // 自动释放池(内存管理方式之一)
    @autoreleasepool {
        // 打印
        NSLog(@"Hello, World!");        // ; 语句分隔符(所有语句)
        NSLog(@"%@",@"字符串");
    }
    return 0;
}
#import 
#import "AppDelegate.h"

int main(int argc, char * argv[]) {
    @autoreleasepool {

        // 创建一个UIApplication对象,和AppDelegate对象(遵守 )       
        // 第3个参数等价于:[UIApplication class](也可以是其子类)  第4个参数:遵守 的一个类
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
    }
}

你可能感兴趣的:(iOS基础之OC)