类和对象
类:是抽象的事物,不具体的东西(人,学生,电脑)
对象:对象是类的实例,是具体的东西(这个人,这个成绩比较好的学生,这台编号为007的电脑)
方法和属性
方法
1.类方法:方法没有涉及到对象的任何数据的时候使用类方法
//求两个数的和,差
2.对象方法:方法涉及到了对象的任何数据(成员变量)的时候,使用对象方法
//求两个人得年龄差
初始化方法:
1.一般初始化 alloc + init
//alloc:开辟内存空间并且将其清零
//init:对象初始化
2.自定义初始化方法:alloc + initWith...
//通过自定义初始化方法定制对象成员变量的值,或属性
3.便利初始化:personWith...类方法类名 + With...
//简单快捷、对象默认自动释放,无需手动释放(默认加入了自动释放池中)
访问器方法和属性
1.访问器方法:setter
和 getter
//setter:对象方法、set成员变量名:参数、为对象的制定成员变量赋值
//getter:对象方法,成员变量名,获取对象指定成员变量的数据
2.属性:property
//自动合成所有需要的setter和getter方法
//iOS5之前使用属性的步骤:成员变量,属性声明,属性合成(@synthesize)
//iOS5之后使用属性的步骤:属性声明
assign:直接赋值,不做内存管理操作,简单复杂数据类型,delegate指针(避免循环引用),SEL(@sleector)
copy:对象复制,NSString(保证安全性,不可变性),block(代码块)
retain:对象持有,对象类型
nonatomic:非原子性,不保证线程安全
atomic:默认属性原子型,保证变量线程安全,会有性能开销
readonly:只读,只生成getter而不会生成setter
getter = ...:定义getter方法的名称
readwrite
//点语法:当一个成员变量拥有属性时,可以使用点语法访问
//setter: = 左边
//getter: = 右边、取值、存在于表达式中
//结构体类型的成员变量无法使用连续点语法赋值 --(等会儿看哈)
//----------------------go---------------------------//
//编程练习:创建Student和Teacher类,为其声明name和age属性,
//实现自定义初始化,
//手动实现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
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);