OC-综合运用

类和对象

类:是抽象的事物,不具体的东西(人,学生,电脑)

对象:对象是类的实例,是具体的东西(这个人,这个成绩比较好的学生,这台编号为007的电脑)

方法和属性

    方法

         1.类方法:方法没有涉及到对象的任何数据的时候使用类方法
         //求两个数的和,差
         2.对象方法:方法涉及到了对象的任何数据(成员变量)的时候,使用对象方法
         //求两个人得年龄差

        

     初始化方法:


         1.一般初始化 alloc + init
         //alloc:开辟内存空间并且将其清零
         //init:对象初始化
         2.自定义初始化方法:alloc + initWith...
    //通过自定义初始化方法定制对象成员变量的值,或属性
         3.便利初始化:personWith...类方法类名 + With...
    //简单快捷、对象默认自动释放,无需手动释放(默认加入了自动释放池中)

访问器方法和属性 

        
         1.访问器方法:setter getter
         //setter:对象方法、set成员变量名:参数、为对象的制定成员变量赋值
         //getter:对象方法,成员变量名,获取对象指定成员变量的数据
         2.属性:property
         //自动合成所有需要的settergetter方法
         //iOS5之前使用属性的步骤:成员变量,属性声明,属性合成(@synthesize
         //iOS5之后使用属性的步骤:属性声明
            assign:直接赋值,不做内存管理操作,简单复杂数据类型,delegate指针(避免循环引用),SEL(@sleector)
            copy:对象复制,NSString(保证安全性,不可变性),block(代码块)
            retain:对象持有,对象类型
            nonatomic:非原子性,不保证线程安全
            atomic:默认属性原子型,保证变量线程安全,会有性能开销
            readonly:只读,只生成getter而不会生成setter
            getter = ...:定义getter方法的名称
            readwrite
         //点语法:当一个成员变量拥有属性时,可以使用点语法访问
         //setter: = 左边
         //getter: = 右边、取值、存在于表达式中
         //结构体类型的成员变量无法使用连续点语法赋值   --(等会儿看哈)
         

      //----------------------go---------------------------//

        //编程练习:创建StudentTeacher类,为其声明nameage属性,

        //实现自定义初始化,

        //手动实现setter方法,

        //实现dealloc以及description

      //----------------------go---------------------------//

集合(数组和字典),字符串

集合中放入nil程序抛出异常

        NSMutableArray *array = [NSMutableArray array];
        NSMutableDictionary *dictionary = [NSMutableDictionary dictionary];
//        [array addObject:nil];
        NSString *name = @"理查德";
        name = nil;
        NSLog(@"%lu",[name length]);   // 0
        //1.
        if ([name length] > 0) {
            [dictionary setObject:name forKey:@"name"];
        }
        //2.
          //  如果name 有值 就打印 如果name没有值打印一个空串
        [dictionary setObject:name ? name : @"" forKey:@"name"];

集合遍历

 1.for循环
 2.快速枚举

       NSArray *array = @[@"1",@"2",@"3",@"4",@"5"];
        //数组快速枚举 for (变量(任意类型)  in   集合 )
        for (id object in array){
            NSString *string = (NSString *)object;//如果用任意类型的话要用字符串的属性就要强转
            NSLog(@"string = %@ length = %lu",string,[string length]);
        }
        
       // 字典就是键值对
        NSDictionary *dictionary = @{
                                     @"key1":@"1",
                                     @"key2":@"2",
                                     @"key3":@"3",
                                     @"key4":@"4",
                                     @"key5":@"5"
                                     };
        //字典的遍历
        for (NSString *key in [dictionary allKeys]){
            NSLog(@"key = %@ value = %@",key, [dictionary objectForKey:key]);
        }

字典有序遍历

 NSArray *keys = [dictionary allKeys];
        keys = [keys sortedArrayUsingSelector:@selector(compare:)];
        for (NSString *string in keys){
            NSLog(@"key = %@, value = %@",string, [dictionary objectForKey:string]);
        }

      //----------------------go---------------------------//

        //编程练习:一个1-100 NSString对象组成的数组,过滤字符串为50以下的元素

        //集合在遍历的时候禁止修改内部结构(例如:不能删除)

      //----------------------go---------------------------//
创建数组:
  NSMutableArray *array = [NSMutableArray array];
        
        for (int i = 1; i <= 100; i ++) {
            NSString *string = [NSString stringWithFormat:@"%d",i];
            [array addObject:string];
        }
错误的逻辑:
        //错误的逻辑(遍历的时候,数组都是固定的,但是又在执行删除,就越界了)
//        for (NSString *str in array){
//            if ([str intValue] < 50) {
//                [array removeObject:str];
//            }
//        }
1.(方法)选取需要的,满足需求的:
      NSMutableArray *newarray = [NSMutableArray array];
        for (NSString *str in array){
            if ([str intValue] >= 50) {
                [newarray addObject:str];
            }
        }
        NSLog(@"%@",newarray);
2.(方法)把需要移除的临时储存,便利完成统一删除
        NSMutableArray *newarray = [NSMutableArray array];
        for (NSString *str in array){
            if ([str intValue] < 50) {
                [newarray addObject:str];
            }
        
        }
        [array removeObjectsInArray:newarray];
        NSLog(@"%@",array);

集合排序

        /* 集合排序 */
        NSArray *array = @[@"6",@"3",@"10",@"5",@"4",@"1",@"2"];
        
        //@selector  方法选取器,在遍历集合的时候会选取进行比较,就是告诉比较的规则,比什么,怎么比,比较的结果是什么
        
        //选取器方法格式: - (NSComparisonResult)compare:(id)object;
        //                                            只能接收一个参数
        //借助类别为字符串添加比较熟知的方法逻辑 ---(首先创建一个类别)(仔细看类别的介绍)
        array = [array sortedArrayUsingSelector:@selector(numericCompare:)];
        NSLog(@"%@",array);

创建类目也就是类别:
NSString+NumericCompare.h
#import <Foundation/Foundation.h>

@interface NSString (NumericCompare)

- (NSComparisonResult)numericCompare:(NSString *)string;

@end

NSString+NumericCompare.m
#import "NSString+NumericCompare.h"

@implementation NSString (NumericCompare)

- (NSComparisonResult)numericCompare:(NSString *)string{
    return [self compare:string options:NSNumericSearch];
}

@end

      //----------------------go---------------------------//

        //编程练习:一个Student的集合,按照Student age从低到高排序

      //----------------------go---------------------------//
方法:
- (NSComparisonResult)compareAge:(Student *)student{
    NSComparisonResult result;
    if (_age == student.age) {
        return NSOrderedSame;      // 0
    }else if(_age < student.age){
        return NSOrderedAscending; // -1 递增
    }else{
        return NSOrderedDescending;// 1 递减
    }
    return result;
}

        Student *student1 = [Student studentWithName:@"student1" age:19];
        Student *student2 = [Student studentWithName:@"student2" age:18];
        Student *student3 = [Student studentWithName:@"student3" age:12];
        Student *student4 = [Student studentWithName:@"student4" age:11];
        Student *student5 = [Student studentWithName:@"student5" age:17];
        
        NSArray *students = @[student1,student2,student3,student4,student5];
        //年龄排序
        students = [students sortedArrayUsingSelector:@selector(compareAge:)];
        NSLog(@"%@",students);

集合内存管理规则

1.对象加入集合,集合持有对象,对象引用计数值+1 

2.对象移除集合,集合释放对象,对象引用计数值-1

3.集合被持有/释放,集合中元素的引用计数不变 

4.集合销毁,所有元素release一次

多种对象类型集合

1.练习一

首先创建学生和老师类,有姓名和年龄两个成员变量
        Student *student1 = [Student studentWithName:@"student1" age:25];
        Student *student2 = [Student studentWithName:@"student2" age:22];
        Teacher *teacher1 = [Teacher teacherWithName:@"teacher1" age:21];
        Teacher *teacher2 = [Teacher teacherWithName:@"teacher2" age:32];
        
        NSArray *people = @[student1,student2,teacher1,teacher2];
        //计算Student 和 Teacher 中 age 的平均值

1.iskindOfClass
       //1.isKindOfClass
        NSInteger averageAge = 0;
        for (id object in people){
        //判断学生
            if ([object isKindOfClass:[Student class]]) {
                Student *student = (Student *)object;
                averageAge += student.age;
            }
        //判断老师
            else if([object isKindOfClass:[Teacher class]]){
                Teacher *teacher = (Teacher *)object;
                averageAge += teacher.age;
            }
        }
        NSLog(@"averageAge = %ld",averageAge/[people count]);
2.协议
#import <Foundation/Foundation.h>

@protocol infonation <NSObject>

@property (assign,nonatomic) NSInteger age;

- (NSComparisonResult)compareAge:(id <infonation>)object;

@end
老师和学生遵守协议
#import <Foundation/Foundation.h>
#import "infonation.h"
@interface Student : NSObject <infonation> {
    NSString *_name;
    NSInteger _age;
}
#import <Foundation/Foundation.h>
#import "infonation.h"
@interface Teacher : NSObject <infonation> {
    NSString *_name;
    NSInteger _age;
}

 main
        //2. 协议
        NSInteger averageAge = 0;
        for (id <infonation> object in people){
            averageAge += [object age];
        }
输出:
        NSLog(@"average = %ld",averageAge/4);

2.练习二

编程练习:将Student Teacher数组按年龄递增排序

方法:(老师和学生中添加)
- (NSComparisonResult)compareAge:(id<infonation>)object{
    NSComparisonResult result;
    if (_age == [object age]) {
        result = NSOrderedSame;
    }else if(_age < [object age]){
        result = NSOrderedAscending;
    }else{
        result = NSOrderedDescending;
    }
    return  result;
}

main
        
        NSArray *newpeople = [people sortedArrayUsingSelector:@selector(compareAge:)];
        NSLog(@"%@",newpeople);



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值