Objective-C
OC是对c语言的扩展,在oc中可以完全实现c的编写
OC可以实现面向对象编程,提供了针对IOS开发的大量类库(类似于c中的函数库)
面向对象编程
提到面向对象就少不了对象、类、类成员……
类:对事物的抽象描述,描述这类事物共同的特征(属性)和行为(方法)
下面在oc中定义一个类
@interface 类名:父类
{//成员(实例)属性
}
-(返回值类型)方法名:参数: //实例方法
+(返回值类型)方法名 //类方法
@end
@implementation 类名
方法实现
@end
对象
类的实例
对象在内存中具有实际的内存空间
对对象的操作
[对象名 方法名:参数:];
对象名->成员//成员(实例)的引用
对象名.成员属性 //@property
类名.成员名
[类名 方法名]
类中成员的属性
@private //私有的 只有这个类才能使用,其他的类都不能用。
@protected//保护的只有此类和此类的子类能够使用
@package //介于@private和@protected之间(这个不懂)
@public //类中的成员不受保护,在任何地方都能使用。
一般情况下把成员属性定义为私有通过公有的方法来访问。
如果没有标注是什么类型的,就默认为@protected
init初始化方法
-(id)init{
if(self = [super init])
{
//初始化
} else {
return nil;
}
return self;
}
子类初始化方法要调用父类初始化方法来初始化从父类继承过来的变量
类的继承
@interface 子类:父类
//子类的实例变量和方法
@end
子类具有父类的所有特征和行为
子类是以父类为模版然后扩建自己的特色
创建子类对象时首先指向父类的init再执行子类的初始化方法init
方法的覆盖
在子类中定义和父类相同的方法,调用时会覆盖父类的方法
首先总结一点昨天忘记总结的一个知识点
1.对类对象的判断
iskindof //判断是否是这个类或这个类的子类的成员或对象
[receiver iskindof :Class];
ismemberof //判断是否是这个类本身的成员或对象
2.对类或实例是否拥有某种方法的判断
-(BOOL) respondsToSelector: selector
判读实例是否有这样方法
+(BOOL)instancesRespondToSelector:
判断类是否有这个方法。此方法是类方法,不能用在类的对象
开始今天的内容
1.属性 @property @property 实例类型 实例名称
使用属性之后的实例,系统会自动生成get 和 set 方法,这样我们就不需要每次都写这两个方法了,如果你用了属性后又写了get和set 方法那也没关系,因为你编写的方法会覆盖系统生成的方法。
使用属性就要在实现文件中使用@synthesize
@synthesize 实例变量名
@porperty和 @synthesize 是成对出现的。
2.static静态变量
Objective-C中静态变量要写在@implementation之外,而且这个静态变量只能在这个.m 文件中使用,在其他地方直接调用,但是可以通过这个文件中的方法改变它的值
使用:可以用来标记某个方法被调用的次数。
3.协议 @protocol
协议就是一些规则的集合,要继承这个协议就必须要实现协议中包含的方法。
一些类为了增加一些其他特性就会继承一些协议,通过这些协议来扩充自己的特性。
@protocol 协议文件中只有方法的声明,谁继承了这个协议谁就去实现协议中包含的方法。
今天讲了oc中的一些基本数据
当然OC支持所有C中的数据类型,intfloat char …
NSNumber
NSNumber 就是把int float char BOOL…封装成对象
NSNumber类具有一些类方法和实例方法
类方法 : 类方法的基本功能就是创建各种值
NSNumber *IntNumber = [NSNumbernumberWithInt:num];
NSNumber *FloatNumber =[NSNumber numberWithFloat:num2];
实例方法:实例方法就是初始化对象
NSNumber *CNumber = [[NSNumberalloc] initWithChar:c];
另外还有两个用于比较两个NSNumber的实例方法
[(NSNumber *)Number (BOOL)isEqualToNumber:(NSNumber *)aNumber ]
[(NSNumber *)Number compare:(NSNumber *)aNumber ]
NSString 可以说这个类是OC中使用最频繁的类
首先怎么创建一个字符串
NSString *str = @"good!";
//1)空字符串创建
NSString *str2 = [[NSString alloc] init];
str2 = @"test";
NSString *str3 = [NSString string];
//2)快速创建字符串
NSString *str4 = [[NSString alloc] initWithString:@"pk"];
NSString *str5 = [NSString stringWithString:@"pk"];
//3)格式化创建字符串
NSString*str6=[[NSStringalloc]initWithFormat:@"%d_%d_%d_%d_%d_%@",1,2,3,4,5,str4];
与NSNumber一样,NSString也有一个比较两个对象的方法
[str4 isEqualToString:str5]
注:这里不能用“==“来判断。isEqualToString:是用来判断两个对象的内容是否相同,而”==“是用来判断两个对象指针是不是指向同一个事物。
类型的转换
//基本数据类型 => 字符串
//str = [[NSString alloc] initWithFormat:@"%d",5];
//字符串 => 基本数据类型
NSString *str7 = [NSString stringWithFormat:@"%d",56];
int num7 = [str7 intValue]; //字符串转整型
//字符串转换 ==>> 数组
NSArray *array = [str6 componentsSeparatedByString:@"_"];
字符串的截取
NSLog(@"substring to 2:%@",[str6 substringToIndex:5]);
NSLog(@"substring to 2 :%@",[str6 substringFromIndex:5]);
//截取某一个范围的字符串
NSRange rang;
rang.length = 4;
rang.location = 2; //截取的时候,不包含起始位置
NSLog(@"substring to 2:%@",[str6 substringWithRange:rang]);
字符串查找(查找子串)
NSString *str8=@"hello01.txt";
//查找 ,返回范围
NSRange rang2 = [str8 rangeOfString:@"."];
可变长度的字符串
NSMutableString *mutableStr =[NSMutableString stringWithString:@"爱大米"];
//动态的插入内容
[mutableStr insertString:@"老鼠" atIndex:0];
NSArray 数组
//定义数组并且初始化
NSArray *array1 = [NSArrayarrayWithObject:@"one"];
NSArray *array2=[NSArray arrayWithObjects:@"one",@"two",@"three",nil]; NSArray *array3 = [NSArray arrayWithArray:array2];
数组的访问
int len = [array2 count];//求长度
NSString *arrayObject = [array3objectAtIndex:3]; //访问元素
//将数组元素连接成一个字符串
NSString *newStr = [array2 componentsJoinedByString:@"_"];
可变数组的使用
NSMutableArray *mutableArray =[NSMutableArray arrayWithObjects:@"one", nil];
[mutableArray addObject:@"two"];//----添加元素
[mutableArrayaddObjectsFromArray:array2]; //---添加一个数组
int length = [mutableArray count]; //----计算长度
[mutableArray removeLastObject]; //---- 移除最后一个
[mutableArray removeObjectAtIndex:0]; //---- 移除指定的数据
数组的遍历方式:传统方式高效方式
for (inti=length-1; i>=0; i--) {//----- 传统方式
NSLog(@"%d =%@",i,[mutableArray objectAtIndex:i]);
}
for(NSString *str inmutableArray){ //----- 高效方式
NSLog(@"obj =%@",str);
}
NSDictionary 字典
初始化 一组数组
NSDictionary *dic1 = [NSDictionary dictionaryWithObject:numObjforKey:@"key1"];
初始化多组数据
NSDictionary*dic2=[NSDictionarydictionaryWithObjectsAndKeys:@"hello",@"key2",@"world",@"key3”,nil];
用一个字典初始化另外一个字典
NSDictionary*dic3 = [NSDictionary dictionaryWithDictionary:dic2]; 可变字典
//----- 初始化
NSMutableDictionary*dic4=[NSMutableDictionarydictionaryWithObjectsAndKeys:@"one",@"key4",@"two",@"key5",nil];
//定义成空字典
NSMutableDictionary *dic5 = [NSMutableDictionary dictionary];
//将字典dic2整体添加到dic4钟
[dic4 addEntriesFromDictionary:dic2];
//添加一个元素
[dic4 setValue:@"three"forKey:@"key6"];
//根据key获取value
NSLog(@"key6 = %@",[dic4objectForKey:@"key6"]);
字典的遍历
//1)一般的遍历
NSArray *keys4 = [dic4 allKeys];
for(int i=0;i<[dic4count];i++){
NSLog(@"dic4 key = %@,value=%@",[keys4objectAtIndex:i],[dic4 objectForKey:[keys4 objectAtIndex:i]]);
}
//2)高效的for
for (NSString *key in dic4){
NSLog(@"dic4 key = %@ ,value = %@",key,[dic4objectForKey:key]);
}
//3)使用枚举进行遍历
NSEnumerator *enum1 = [dic4 keyEnumerator];
//获取key,如果不为空,则进行偏移
id key = [enum1 nextObject];
while (key) {
NSLog(@"key = %@ ,value = %@",key,[dic4 objectForKey:key]);
key = [enum1 nextObject];
}
今天先更新到这里,之后随堂整理更新,若有错误欢迎指正,共同交流学习 ------LC