//block遍历 效率最快
[arr enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
//obj 数组的元素 idx 数组的索引 *stop是否停止遍历
if ([obj isEqualToString:@"2"] == YES) {
//*stop 等于YES 遍历停止
*stop = YES;
}
}];
//快速遍历
for (NSString * str in arr) {
}
NSDictionary *dic;
//字典block遍历
[dic enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
//key 字典的key键 obj 字典的value值
}];
ID类型声明的对象不能使用点语法,可以使用set方法,id不能确定类型,所以找不到相应的类,也就找不到相应的对象。
打印BOOL类型用%hhd
添加数组元素[array oddobject:@“A”];
[str1 UTF8String]//字符串转换成C字符串
[obj respondsToSelector:sel]判断obj中有没有sel这个方法
// isMemberOfClass: 判断对象是否是某个类的对象
//使用performSelector来执行sel变量对应的方法
===========================================================================
instance 只能作为返回值不能作参数
instance 只能返回当前对象类型的对象
id能返回未知类型的对象
id可以作为返回值,也可以作为参数
Nsobject定义子孙类对象必须进行类型强转
id定义子孙类对象不需要类型强转
一个对象能不能调用某个方法不由编译器决定,由运行时决定
========================================================================
BOOL isrespond=[Dog instancesRespondToSelector:@selector(eat)];
判断类中有没有指定的方法
BOOL isrespond= [ani respondsToSelector:@selector(eat)];
判断实例对象能否(响应)指定的方法
BOOL isKind= [ani isKindOfClass:[Animal class]];
判断实例对象是否是这个类或者这个类的子类的实例
isKind=[dog isMemberOfClass:[Animal alloc]];
判断对象是否是某个类的实例对象
BOOL isSub=[Dog isSubclassOfClass:[Animal class]];
判断一个类是不是另一个类的子类
[ani performSelector:@selector(eat)];
判断ani能否响应某个方法
==========================================================================
@property属性。
atomic 对属性加锁,多线程下线程安全,默认值
nonatomic对属性不加锁,多线程下不安全,但是速度快
readwrite 生成getter\setter默认值
readonly 只生成getter方法
weak: 在arc模式下,效果相当于assign,但还比assign多一个功能
strong:在arc(自动内存管理模式下,效果相当于retain
set方法处理
assign直接赋值,默认值,适用于直接赋值。
retain 先release原来的值,再retain新值,适用于OC对象
copy 先release原来的值,再copy新值
=============================================================================
分类—-(category)就是在不修改原有类的基础上给类增加新的方法。
使用步骤:声明一个分类,实现这个分类,使用分类中的方法
新建分类文件时,给谁增加分类就继承于谁。
@interface Person(playGame)声明和实现格式无非就是加了一个括号和文件名,在main函数中需要包含头文件。
1.分类只能增加方法,不能增加成员(实例)变量
2.分类中可以访问类中的实例变量
3.如果分类中和类中有同名的方法,优先访问分类中的方法
4.如果有两个分类中都有同名的方法,执行的是最后编译的那个类别的方法,编译顺序在系统配置中查看
==============================================================================
非正式协议:所谓非正式协议就是类别,即凡是NSObject或其子类的类别,都是非正式协议
凡是NSobject以及其Fundation框架中的增加的类都叫非正式协议。
比如:给NSobject增加一个新的分类,类里增加的所有的方法main函数中的对象都可以使用
如:NSString+countNum非正式协议 Person+countNum就是分类
如果分类声明时继承于nsstring,那么程序中用nsstring定义的字符都可以当作对象调用分类中的方法
===========================================================================
延展是一个特殊的分类,也叫类扩展
@interface Person()匿名分类,可以用来声明实例变量,但方法的实现只能在实现的原实现文件中实现,不能使用@implementation Person()实现
用@interface Person()在.m的文件里进行声明一般来说是私有实例变量
============================================================================
@class XXXX的使用
可以简单的引入一个类,含义就是告诉编译器引入的是一个类,至于类中有哪些方法和属性,此处编译器不去检测。
好处:如果引入的xxxx文件发生变化,不需要重新编译。可以解决交叉引用出错。必须有一方用@class
使用方式
@class AA; 在.h文件里
#import “AA.h” 在.m文件里
================================================================================
Block使用
int (^block)(int,float)=^(int a,float b);
block1=^(int a,float b);重新赋值
在block内部不能修改block外部变量的值(全局变量除外)。如果要修改外部变量用__block修饰。用__block修饰的变量放在堆区,而不放在栈区
block分为全局block,堆block,栈block
inlineBlock Block助记符
==================================================================================
内存管理
凡是使用alloc、new(或者new开头的方法)、copy(或者copy开头的方法),mutableCopy(或者mutableCopy的方法)、retain创建的对象都需要手动release(引用计数为0会被自动释放
Xcode5之后默认自动管理,手动关需要修改【工程】 — Build Settings —搜索gar — YES改成NO
ARC非ARC混编 Build phase ——> Complie Source ———> -fno-objc-arc
3.1四个关键字
__strong(强引用) 缺省属性,其修饰的对象指针,指向哪个对象,会对该对象retain,离开哪个对象,会对该对象release。
__weak(弱引用)其修饰的对象指针,指向任何对象都不会retain。这样的指针指向的对象随时可能消失。如果对象消失了,这个指针会自动变成nil。
//在iOS编程中,代理对象使用弱引用。
__unsafe_unretained 其修饰的对象指针,指向任何对象都不retain。当指向的对象消失,该指针不会变成nil,仍然指向已经释放的对象 // 会变成野指针
__autoreleasing 只用来修饰需要被传入地址的指针。如:
__autoreleasing NSError * error; &error; //写不写都一样,所以还是不写
=========================================================================================
NSNumber 继承自NSValue
int i=88;
//将int封装成一个oc对象v1
NSValue *v1=[[NSValue alloc]initWithBytes:&i objCType:@encode(int) ];
//从一个oc对象得到int类型
int ret;
[v1 getValue:&ret];
NSLog(@"ret=%d\n",ret);
NSNumber提供了对基本数据类型一步到位的封装
NSNumber*n1=[NSNumber numberWithInt:i];
NSLog(@"n1.intValue=%d", n1.intValue);
三种写文件的方式:
1.NSFileManager (文件可以不存在,不存在会创建)
NSString * str =@"
[arr enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
//obj 数组的元素 idx 数组的索引 *stop是否停止遍历
if ([obj isEqualToString:@"2"] == YES) {
//*stop 等于YES 遍历停止
*stop = YES;
}
}];
//快速遍历
for (NSString * str in arr) {
}
NSDictionary *dic;
//字典block遍历
[dic enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
//key 字典的key键 obj 字典的value值
}];
ID类型声明的对象不能使用点语法,可以使用set方法,id不能确定类型,所以找不到相应的类,也就找不到相应的对象。
打印BOOL类型用%hhd
添加数组元素[array oddobject:@“A”];
[str1 UTF8String]//字符串转换成C字符串
[obj respondsToSelector:sel]判断obj中有没有sel这个方法
// isMemberOfClass: 判断对象是否是某个类的对象
//使用performSelector来执行sel变量对应的方法
===========================================================================
instance 只能作为返回值不能作参数
instance 只能返回当前对象类型的对象
id能返回未知类型的对象
id可以作为返回值,也可以作为参数
Nsobject定义子孙类对象必须进行类型强转
id定义子孙类对象不需要类型强转
一个对象能不能调用某个方法不由编译器决定,由运行时决定
========================================================================
BOOL isrespond=[Dog instancesRespondToSelector:@selector(eat)];
判断类中有没有指定的方法
BOOL isrespond= [ani respondsToSelector:@selector(eat)];
判断实例对象能否(响应)指定的方法
BOOL isKind= [ani isKindOfClass:[Animal class]];
判断实例对象是否是这个类或者这个类的子类的实例
isKind=[dog isMemberOfClass:[Animal alloc]];
判断对象是否是某个类的实例对象
BOOL isSub=[Dog isSubclassOfClass:[Animal class]];
判断一个类是不是另一个类的子类
[ani performSelector:@selector(eat)];
判断ani能否响应某个方法
==========================================================================
@property属性。
atomic 对属性加锁,多线程下线程安全,默认值
nonatomic对属性不加锁,多线程下不安全,但是速度快
readwrite 生成getter\setter默认值
readonly 只生成getter方法
weak: 在arc模式下,效果相当于assign,但还比assign多一个功能
strong:在arc(自动内存管理模式下,效果相当于retain
set方法处理
assign直接赋值,默认值,适用于直接赋值。
retain 先release原来的值,再retain新值,适用于OC对象
copy 先release原来的值,再copy新值
=============================================================================
分类—-(category)就是在不修改原有类的基础上给类增加新的方法。
使用步骤:声明一个分类,实现这个分类,使用分类中的方法
新建分类文件时,给谁增加分类就继承于谁。
@interface Person(playGame)声明和实现格式无非就是加了一个括号和文件名,在main函数中需要包含头文件。
1.分类只能增加方法,不能增加成员(实例)变量
2.分类中可以访问类中的实例变量
3.如果分类中和类中有同名的方法,优先访问分类中的方法
4.如果有两个分类中都有同名的方法,执行的是最后编译的那个类别的方法,编译顺序在系统配置中查看
==============================================================================
非正式协议:所谓非正式协议就是类别,即凡是NSObject或其子类的类别,都是非正式协议
凡是NSobject以及其Fundation框架中的增加的类都叫非正式协议。
比如:给NSobject增加一个新的分类,类里增加的所有的方法main函数中的对象都可以使用
如:NSString+countNum非正式协议 Person+countNum就是分类
如果分类声明时继承于nsstring,那么程序中用nsstring定义的字符都可以当作对象调用分类中的方法
===========================================================================
延展是一个特殊的分类,也叫类扩展
@interface Person()匿名分类,可以用来声明实例变量,但方法的实现只能在实现的原实现文件中实现,不能使用@implementation Person()实现
用@interface Person()在.m的文件里进行声明一般来说是私有实例变量
============================================================================
@class XXXX的使用
可以简单的引入一个类,含义就是告诉编译器引入的是一个类,至于类中有哪些方法和属性,此处编译器不去检测。
好处:如果引入的xxxx文件发生变化,不需要重新编译。可以解决交叉引用出错。必须有一方用@class
使用方式
@class AA; 在.h文件里
#import “AA.h” 在.m文件里
================================================================================
Block使用
int (^block)(int,float)=^(int a,float b);
block1=^(int a,float b);重新赋值
在block内部不能修改block外部变量的值(全局变量除外)。如果要修改外部变量用__block修饰。用__block修饰的变量放在堆区,而不放在栈区
block分为全局block,堆block,栈block
inlineBlock Block助记符
==================================================================================
内存管理
凡是使用alloc、new(或者new开头的方法)、copy(或者copy开头的方法),mutableCopy(或者mutableCopy的方法)、retain创建的对象都需要手动release(引用计数为0会被自动释放
Xcode5之后默认自动管理,手动关需要修改【工程】 — Build Settings —搜索gar — YES改成NO
ARC非ARC混编 Build phase ——> Complie Source ———> -fno-objc-arc
3.1四个关键字
__strong(强引用) 缺省属性,其修饰的对象指针,指向哪个对象,会对该对象retain,离开哪个对象,会对该对象release。
__weak(弱引用)其修饰的对象指针,指向任何对象都不会retain。这样的指针指向的对象随时可能消失。如果对象消失了,这个指针会自动变成nil。
//在iOS编程中,代理对象使用弱引用。
__unsafe_unretained 其修饰的对象指针,指向任何对象都不retain。当指向的对象消失,该指针不会变成nil,仍然指向已经释放的对象 // 会变成野指针
__autoreleasing 只用来修饰需要被传入地址的指针。如:
__autoreleasing NSError * error; &error; //写不写都一样,所以还是不写
=========================================================================================
NSNumber 继承自NSValue
int i=88;
//将int封装成一个oc对象v1
NSValue *v1=[[NSValue alloc]initWithBytes:&i objCType:@encode(int) ];
//从一个oc对象得到int类型
int ret;
[v1 getValue:&ret];
NSLog(@"ret=%d\n",ret);
NSNumber提供了对基本数据类型一步到位的封装
NSNumber*n1=[NSNumber numberWithInt:i];
NSLog(@"n1.intValue=%d", n1.intValue);
三种写文件的方式:
1.NSFileManager (文件可以不存在,不存在会创建)
NSString * str =@"