Block和属性
#import<Foundation/Foundation.h>typedefvoid(^MyBlock)();typedefNSString*(^test)();//intnumber=300;//int(intx,inty)//{//intsum;//sum=(x+y);//returnsum;//}intmain(intargc,constchar*argv[]){@autoreleasepool{//inta=3,b=4;//printf("%d\n",(a,b));//int(^p)(int,int);p=^int(intx,inty){intsum;sum=(x+y);returnsum;};//类型:int(^)(int,int)NSLog(@"sum==%d",p(3,7));//block;本质上是匿名函数,于函数十分相似//返回值类型(^变量名)(行参数)=^返回值类型(行参){函数实现};//Block的四种不同类型//1,无法返回值,无参数void(^firstBloack)()=^void{NSLog(@"ThisismyFirstBlock");};//调用Bloack--声明作用。。firstBloack();//2.无返回值,有参数void(^secondBloack)(NSString*str)=^void(NSString*str){NSLog(@"%@是2B",str);};secondBloack(@"泥煤");//3.有返回值,无参数NSString*(^thirdBloack)()=^NSString*(){return@"希望世界和平";};NSLog(@"%@",thirdBloack());//thirdBloack();//4.有返回值,有参数,//返回值类型(^变量名)(行参数)=^返回值类型(行参){};NSString*(^fourthBlock)(NSString*str1,NSString*str2)=^NSString*(NSString*str1,NSString*str2){return[str1stringByAppendingString:str2];};NSLog(@"%@",fourthBlock(@"liu",@"yafang"));//联系,,IOS4中才有Blockint(^getBlock)(NSString*str)=^int(NSString*str){return[strintValue];};NSLog(@"%d",getBlock(@"9d1a2"));//Block和变量。。//在main函数里在block外声明的局部变量在block内部调用时相当于有const修饰不能修改变量的值.这时候我们通过__block来修饰变量改变这种模式.集体实现方式为:如果在block中访问全局变量就不需要__block修饰//当变量不加下划线下划线block即:__block(局部变量)在block内使用时当做常量来使用是readonly的,不能修改//__block的作用告诉编译器,编译时在block内部不要把外部变量当做常量来使用,还当做变量来使用//staticintnumber=300;//还可以利用静态来休哥局部变量__blockintnumber=300;//__block修改变量,,,,全局和局部,,,MyBlockchangeNumberBlock//代替下面注释的/*void(^changeNumberBlock)()*/=^void(){number=400;};changeNumberBlock();NSLog(@"%d",number);//1.Block可以直接修改全局变量//2.Block可以访问局部变量,但不能直接修改局部变量的值,如果需要修改,在变量类型前面添加__block关键字#pragmamark-typedef;//NSIntegerMyBlockchangeNumberBlock1=^void(){number=100;};changeNumberBlock1();NSLog(@"%d",number);testappend=^NSString*(NSString*str1,NSString*str2){return[str1stringByReplacingOccurrencesOfString:str1withString:str2];};NSLog(@"%@",append(@"liu1",@"liuxiaomeng0"));testreplace=^NSString*(NSString*str1,NSString*str2){return[str1stringByReplacingCharactersInRange:NSMakeRange(0,2)withString:str2];};NSLog(@"%@",replace(@"liyafang",@"liu"));}return0;}
/////----下面转载于光远------////
block 注意实现形式
基本语法: 本质上是匿名函数,与函数真真十分相似
称之为函数的实现部分,返回值省略不写
变量block的类型int (^)(int x, int y)变量名字:block 可以为任意符合变量命名规范的名
=右边的block用来存储函数初始值是一个函数的实现部分
int(^block)(intx ,inty) = ^(intx,inty){
returnx + y;
};//相当于语句的定义,结尾加分号要注意
当把函数的实现赋给block之后,block变量就可以当做函数名来使用
如:intsum = block(5,10);
NSLog(@"sum = %d",sum);
int(^block1)(intx,inty) =^(intx,inty){
returnx > y ? x : y;
}; 初值的实现部分
intmax = block1(5,19);
NSLog(@"max = %d",max);
int(^block3)(intx,inty) = ^(intx,inty){
returnx < y ? x : y;
};
intmin = block3(5,19);
NSLog(@"min = %d",min);
1.另外:也可以用对block进行typedef
如:数据类型:void(^)()BLOCK新的变量类型名
typedefvoid(^BLOCK)();
BLOCK sayHi = ^(){
NSLog(@"hello");
};
sayHi();//调用无参的函数 函数名+();
类比于函数指针.
2.还需注意:在main函数里 在block外声明的局部变量在block内部调用时相当于有const修饰 不能修改变量的值.这时候我们通过__block来修饰变量改变这种模式.集体实现方式为:如果在block中访问全局变量就不需要__block修饰
当变量不加下划线下划线block即:__block (局部变量)在block内使用时当做常量来使用是readonly的,不能修改
__block的作用告诉编译器,编译时在block内部不要把外部变量当做常量来使用,还当做变量来使用
__blockinta =10;
int(^max1)(int,int)= ^(intx ,inty){
a =20;
b=30;
returnx *a;
};
(1)相同函数名的处理机制:对于定义在不同函数的相同名的两个变量.如果想要同时使用就把两者定义成为static变量static int b = 120;,如果想要在一个函数里使用另一函数的全局变量,就使用extern进行导入.extern int b;
28.属性用来替代setter和getter,使用属性可以快速创建setter和getter的声明,添加了设置实例变量操作的安全处理
setter方法的作用为单一的变量赋值
规范写法:-号方法无返回值有参数名字以:set开头+实例变量名(首字母大写):(setter方法有且只有一个参数) +参数类型(和实例变量类型相同) +参数名(和实例变量名相同)
getter方法的作用获取单一的实例变量值
规范写法: _号方法有返回值(返回值类型和实例变量类型相同)方法名和实例变量相同无参数
属性,用来替代setter和getter,使用属性可以快速创建setter和getter的声明,添加了设置实例变量操作的安全处理
@property属性NSString*类型和实例变量类型相同name属性名和实例变量名相同
切记:@property只是自动生成setter和getter的声明部分
类型相同是可以写一行
属性特性
1.读写特性readonly readwrite
1.readonly告诉编译器,属性在自动生成方法时只会生成getter不会生成setter方法
2.readwrite告诉编译器,属性在自动生成方法时,会生成为setter和getter.系统默认的读写特性
3.setter = aa:告诉编译器,当自动生成setter方法时,setter方法名为指定的名字aa:不采用默认
4.getter = bb:告诉编译器,当自动生成getter方法时,getter方法名为指定的名字bb:不采用默认
2.原子性特性nonatomic atomic
1.atomic:原子特性保证线程安全,内部做了安全处理(加锁和解锁)
2.nonatomic:非原子特性,不保证线程安全
因为对于setter和getter方法的使用,比较频繁的在一段时间内要多次访问,降低程序的执行效率,使用nonatomic虽然不保证线程的安全,但使用一般情况下是安全的,所以对于原子特性使用nonatomic
3.语义特性
1.assign :直接赋值使用针对于基本数据类型,也可针对于对象类型.系统默认的语义特性.
2.copy:针对对象类型,而且要服从NSCopying协议的类型的对象才可以.恢复至出一个新的对象,拥有新的对象的所有权(引用计数+1)
3.retain :针对于对象类性(NSString,NSArray),会造成对象引用计数+1.
29.属性的实现
声明部分:
@property(nonatomic,retain)NSString*name;
@property(nonatomic,retain)NSString*gender;
@property(nonatomic,assign)NSIntegerage;
@property(nonatomic,assign)CGFloatheight;绿色部分可省略 默认可省
@property(nonatomic,assign)CGFloatweight;
实现部分:
@synthesize属性自动生成setter和getter方法的实现部分name属性名,指定要实现哪一个属性生成setter和getter方法_name ,指定setter和getter方法的内部实现要操作的实例变量
如果指定的实例变量没有定义,系统会自动生成,但是生成的实例变量是私有的,子类不能访问.
如果实例变量想让子类使用访问,那在.h文件必须定义实例变量
如果未指定setter和getter内部所要访问的实例方法时,系统会自动生成和属性名一样的实例变量
如果对于setter和getter方法我们一旦实现以后,系统就不会自动生成.
@synthesizename =_name,gender =_gender,age =_age,height =_height,weight =_weight;//附上要实现的实例变量
如果在.m文件中未通过@synthesize对属性进行合成,系统会自动合成,只不过系统默认的setter和getter方法是: _属性名
如果将@synthesize省略,并且我们自己实现setter以及getter方法时,系统就不会自动生成对应的setter和getter,还有实例变量.
1.当把语义特性声明为assign时,setter和getter的内部实现.同系统写的setter和getter方法
- (void)setName:(NSString *)name{
_name = name;
}
- (NSString *)name{
return _name;
}
注意:二和三基本一样 不同部分为洋红色部分
2.当把语义特性声明为retain时,setter和getter的内部实现.
- (void)setName:(NSString *)name{
if(_name != name){
[_name release];
_name = [nameretain];
}
}
- (NSString *)name{
return [[_name retain] autorelease];
}
3.当把语义特性声明为copy时,setter和getter的内部实现.
- (void)setName:(NSString *)name{
if(_name != name){
[_name release];
_name = [namecopy];
}
}
- (NSString *)name{
return [[_name retain] autorelease];
}
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。