面向对象(下)一、包装类概念是用来把基本类型(int,float,char)“包装”为对象的类以下非包装类NSInteger大致等于long类型NSUInteger大致等于unsigned long类型CGFLoat大致等于double类型是包装类NSValue是NSNumber的父类代表一个更通用的包装类可以包装int,float,short,long,char,指针,id并将他们加到NSArray,NSSet中NSNumber方法numberWithXxx:直接将特定类型的值包装成NSNumber-initWithXxx:该方法需要先创建一个NSNumber对象再用一个基本类型的值来初始化NSNumber-xxxValue:该方法返回NSNumber对象包装的基本类型的值NSNumber*num[NSNumber numberWithInt:20];NSNumber*de[NSNumber numberWithDouble:3.4];NSLog(%d,[num intValue]);NSLog(%g,[de doubleValue]);NSNumber*ch[[NSNumber alloc]initWithChar:J];NSLog(%,ch);//输出J的ASCLL码二、处理对象打印对象和description方法当执行NSLog(%, obj);时会自动调用-description方法返回一个NSString若不重写- description,答应出来是MyClass:0x600003f88100//类名和内存地址重写-description:#importfkapple.himplementationfkapple-(id)initWithColor:(NSString*)color weight:(double)weight{if(self[superinit]){self.colorcolor;self.weightweight;}returnself;}-(NSString*)description{return[NSString stringWithFormat:fkapple[_color %, _weight %g],self.color,self.weight];}endfkapple*a[[fkapple alloc]initWithColor:红色weight:5.68];NSLog(%,a);NSLog(%.2f,a.weight);输出结果为fkapple[_color 红色, _weight 5.68] 5.68和isEqual:方法如果两个变量是基本类型且都是数值类型则变量值相等对于指针类型只有保存地址相同才返回真。比较两个类型上没有继承关系的指针变量时会警告。intit65;floatf165.0f;NSLog(65和65.0f是否相等?: %d,(itf1));//1charchA;NSLog(65和A是否相等%d,(itch));NSString*str1[NSString stringWithFormat:疯狂iOS讲义];NSString*str2[NSString stringWithFormat:疯狂iOS讲义];//这个stringWithFormat 函数返回的是一个 NSString 类型的对象NSLog(str1和str2 是否相等%d,(str1str2));//输出 0两个指针不相等NSLog(str1是否isEqual: str2? %d,[str1 isEqual:str2]);//输出 1重写isEqual:NSString已经重写了NSObject的isEqual方法判断两个字符串的字符序列相同#importFoundation/Foundation.hNS_ASSUME_NONNULL_BEGINinterfaceFKUser:NSObjectproperty(nonatomic,copy)NSString*name;property(nonatomic,copy)NSString*idstr;-(id)initWithName:(NSString*)name idstr:(NSString*)idstr;end#importFKUser.himplementationFKUser-(id)initWithName:(NSString*)name idstr:(NSString*)idstr{if(self[superinit]){self.namename;self.idstridstr;}returnself;}-(BOOL)isEqual:(id)other{if(selfother){returnYES;}if(other!nil[other isMemberOfClass:FKUser.class]){FKUser*target(FKUser*)other;return[self.idstr isEqual:target.idstr];}returnNO;}end满足的条件自反性任意非nil对象必须等于他自己对称性若a等于bb也等于a传递性若a等于bb等于c则a等于c一致性对象没变多次比较结果应始终如一与nil比较必须返回NO三、类别与拓展类别为现有类添加方法不需要创建子类接口部分:interface已有类 类别名...end定义类时使用类名必须时该类中不存在的类而定义类别时使用的类名必须是已有的类定义类别是必须用圆括号来包括类别名类别中通常只定义方法实现部分implmentation 已有类 类别名...end例子//接口部分#importFoundation/Foundation.hNS_ASSUME_NONNULL_BEGINinterfaceNSNumber(fk)-(NSNumber*)add:(double)num2;-(NSNumber*)substract:(double)num2;-(NSNumber*)multiply:(double)num2;-(NSNumber*)divide:(double)num2;endNS_ASSUME_NONNULL_END//实现部分#importNSNumberfk.himplementationNSNumber(fk)-(NSNumber*)add:(double)num2{return[NSNumber numberWithDouble:([selfdoubleValue]num2)];}-(NSNumber*)substract:(double)num2{return[NSNumber numberWithDouble:([selfdoubleValue]-num2)];}-(NSNumber*)multiply:(double)num2{return[NSNumber numberWithDouble:([selfdoubleValue]*num2)];}-(NSNumber*)divide:(double)num2{return[NSNumber numberWithDouble:([selfdoubleValue]/num2)];}end//主函数NSNumber*mynum[NSNumber numberWithInt:3];NSNumber*add[mynum add:2.4];NSLog(%,add);NSNumber*substract[mynum substract:2.4];NSLog(%,substract);NSNumber*multiply[mynum multiply:2.4];NSLog(%,multiply);NSNumber*divide[mynum divide:2.4];NSLog(%,divide);输出5.40.60000000000000017.1999999999999991.25作用利用类别进行模块化设计通过类别可以对类实现按模块分布到不同的.m文件中从而提高项目后期的可维护性。使用类别调用私有方法#importFoundation/Foundation.hinterfaceFKItemproperty(nonatomic,assign)dounle price;-(void)info;end#importFKItemimplementationFKItemsynthesizeprice;-(void)info{NSLog(这是一个普通的方法)}-(double)calDiscount:(doule)discount{returnself.price*discount;}endinterfaceFKItem(fk)-(dounle)calDiscount:(double)discount;end#importFoundation/Foundation.h#importFKItemintmain(intargc,constchar*argv[]){implementation{FKItem*item[[FKItem alloc]init];item.price109;[item info];NSLog(物品打折的价格为%g,[item calDiscount:75]);}}扩展格式interface已有类(){实例变量}//方法定义...end例//接口部分#importFoundation/Foundation.hNS_ASSUME_NONNULL_BEGINinterfacefkcar:NSObjectproperty(nonatomic,copy)NSString*brand;property(nonatomic,copy)NSString*model;-(void)drive;end//拓展#importFoundation/Foundation.h#importfkcar.hNS_ASSUME_NONNULL_BEGINinterfacefkcar()property(nonatomic,copy)NSString*color;-(void)drive:(NSString*)owner;end#importfkcardrive.himplementationfkcar-(void)drive{NSLog(%汽车正在路上奔驰,self);}-(void)drive:(NSString*)owner{NSLog(%正在驾驶%汽车在路上奔驰,owner,self);}-(NSString*)description{return[NSString stringWithFormat:fkcar[_brand %, _model %, _color %],self.brand,self.model,self.color];}end//主函数fkcar*car[[fkcar alloc]init];car.brand宝马;car.modelx5;car.color黑色;[car drive];[car drive:开开心心];四、协议与委托协议规定一个类必须做什么但不限定怎么做使用protocol声明protocol协议名父协议1,父协议2{零到多个方法定义}使用类别实现非正式协议#importFoundation/Foundation.hinterfaceNSObject(Eatable)-(void)taste;end#importNSObjectEatable.hinterfaceFKApple:NSObjectend#importFKApple.himplementationFKApple-(void)taste{NSLog(苹果营养丰富口味很好);}end#importFoundation/Foundation.h#importFKApple.hintmain(intargc,char*argv[]){autoreleasepool{FKApple*app[[FKApple alloc]init];[app taste];}}正式协议protocolFKOutput-(void)output;-(void)addData:(NSString*)msg;end#importFoundation/Foundation.hprotocolFKProductable-(DSDate*)getProduceTime;end#importFoundation/Foundation.h#importFKOutput.h#importFKProductable.hprotocolFKPrintableFKOutput,FKProductable-(NSString*)printColor;end遵守协议#importFKPrinter.h#defineMAX_CACHE_LINE10implementationFKPrinter{NSString*printData[10];intdataNum;}-(void)output{while(dataNum0){NSLog(use%打印:%,self.printColor,printData[0]);dataNum--;for(inti0;idataNum;i){printData[i]printData[i1];}}}-(void)addData:(NSString*)msg{if(dataNumMAX_CACHE_LINE){NSLog(输出队列已满);}else{printData[dataNum]msg;}}-(NSData*)getProduceTime{return[[NSData alloc]init];}-(NSString*)printColor{return红色;}end;1、optional位于该关键字只后、required或end之前声明的方法是可选的实现类可选择是否实现这些方法。2、required位于该关键字之后、 optional 或end之前声明的方法是必需的实现类必需实现这些方法。协议与委托协议体现的是一种规范定义协议的类可以把协议定义的方法委托给实现协议的类这样可以让类定义具有更好的通用性因为具体的动作将由该协议的实现类去完成。无论是基于 Mac 的Cococa应用开发还是iOS开发各种应用程序大量依赖委托这个概念。
面向对象(下)
面向对象(下)一、包装类概念是用来把基本类型(int,float,char)“包装”为对象的类以下非包装类NSInteger大致等于long类型NSUInteger大致等于unsigned long类型CGFLoat大致等于double类型是包装类NSValue是NSNumber的父类代表一个更通用的包装类可以包装int,float,short,long,char,指针,id并将他们加到NSArray,NSSet中NSNumber方法numberWithXxx:直接将特定类型的值包装成NSNumber-initWithXxx:该方法需要先创建一个NSNumber对象再用一个基本类型的值来初始化NSNumber-xxxValue:该方法返回NSNumber对象包装的基本类型的值NSNumber*num[NSNumber numberWithInt:20];NSNumber*de[NSNumber numberWithDouble:3.4];NSLog(%d,[num intValue]);NSLog(%g,[de doubleValue]);NSNumber*ch[[NSNumber alloc]initWithChar:J];NSLog(%,ch);//输出J的ASCLL码二、处理对象打印对象和description方法当执行NSLog(%, obj);时会自动调用-description方法返回一个NSString若不重写- description,答应出来是MyClass:0x600003f88100//类名和内存地址重写-description:#importfkapple.himplementationfkapple-(id)initWithColor:(NSString*)color weight:(double)weight{if(self[superinit]){self.colorcolor;self.weightweight;}returnself;}-(NSString*)description{return[NSString stringWithFormat:fkapple[_color %, _weight %g],self.color,self.weight];}endfkapple*a[[fkapple alloc]initWithColor:红色weight:5.68];NSLog(%,a);NSLog(%.2f,a.weight);输出结果为fkapple[_color 红色, _weight 5.68] 5.68和isEqual:方法如果两个变量是基本类型且都是数值类型则变量值相等对于指针类型只有保存地址相同才返回真。比较两个类型上没有继承关系的指针变量时会警告。intit65;floatf165.0f;NSLog(65和65.0f是否相等?: %d,(itf1));//1charchA;NSLog(65和A是否相等%d,(itch));NSString*str1[NSString stringWithFormat:疯狂iOS讲义];NSString*str2[NSString stringWithFormat:疯狂iOS讲义];//这个stringWithFormat 函数返回的是一个 NSString 类型的对象NSLog(str1和str2 是否相等%d,(str1str2));//输出 0两个指针不相等NSLog(str1是否isEqual: str2? %d,[str1 isEqual:str2]);//输出 1重写isEqual:NSString已经重写了NSObject的isEqual方法判断两个字符串的字符序列相同#importFoundation/Foundation.hNS_ASSUME_NONNULL_BEGINinterfaceFKUser:NSObjectproperty(nonatomic,copy)NSString*name;property(nonatomic,copy)NSString*idstr;-(id)initWithName:(NSString*)name idstr:(NSString*)idstr;end#importFKUser.himplementationFKUser-(id)initWithName:(NSString*)name idstr:(NSString*)idstr{if(self[superinit]){self.namename;self.idstridstr;}returnself;}-(BOOL)isEqual:(id)other{if(selfother){returnYES;}if(other!nil[other isMemberOfClass:FKUser.class]){FKUser*target(FKUser*)other;return[self.idstr isEqual:target.idstr];}returnNO;}end满足的条件自反性任意非nil对象必须等于他自己对称性若a等于bb也等于a传递性若a等于bb等于c则a等于c一致性对象没变多次比较结果应始终如一与nil比较必须返回NO三、类别与拓展类别为现有类添加方法不需要创建子类接口部分:interface已有类 类别名...end定义类时使用类名必须时该类中不存在的类而定义类别时使用的类名必须是已有的类定义类别是必须用圆括号来包括类别名类别中通常只定义方法实现部分implmentation 已有类 类别名...end例子//接口部分#importFoundation/Foundation.hNS_ASSUME_NONNULL_BEGINinterfaceNSNumber(fk)-(NSNumber*)add:(double)num2;-(NSNumber*)substract:(double)num2;-(NSNumber*)multiply:(double)num2;-(NSNumber*)divide:(double)num2;endNS_ASSUME_NONNULL_END//实现部分#importNSNumberfk.himplementationNSNumber(fk)-(NSNumber*)add:(double)num2{return[NSNumber numberWithDouble:([selfdoubleValue]num2)];}-(NSNumber*)substract:(double)num2{return[NSNumber numberWithDouble:([selfdoubleValue]-num2)];}-(NSNumber*)multiply:(double)num2{return[NSNumber numberWithDouble:([selfdoubleValue]*num2)];}-(NSNumber*)divide:(double)num2{return[NSNumber numberWithDouble:([selfdoubleValue]/num2)];}end//主函数NSNumber*mynum[NSNumber numberWithInt:3];NSNumber*add[mynum add:2.4];NSLog(%,add);NSNumber*substract[mynum substract:2.4];NSLog(%,substract);NSNumber*multiply[mynum multiply:2.4];NSLog(%,multiply);NSNumber*divide[mynum divide:2.4];NSLog(%,divide);输出5.40.60000000000000017.1999999999999991.25作用利用类别进行模块化设计通过类别可以对类实现按模块分布到不同的.m文件中从而提高项目后期的可维护性。使用类别调用私有方法#importFoundation/Foundation.hinterfaceFKItemproperty(nonatomic,assign)dounle price;-(void)info;end#importFKItemimplementationFKItemsynthesizeprice;-(void)info{NSLog(这是一个普通的方法)}-(double)calDiscount:(doule)discount{returnself.price*discount;}endinterfaceFKItem(fk)-(dounle)calDiscount:(double)discount;end#importFoundation/Foundation.h#importFKItemintmain(intargc,constchar*argv[]){implementation{FKItem*item[[FKItem alloc]init];item.price109;[item info];NSLog(物品打折的价格为%g,[item calDiscount:75]);}}扩展格式interface已有类(){实例变量}//方法定义...end例//接口部分#importFoundation/Foundation.hNS_ASSUME_NONNULL_BEGINinterfacefkcar:NSObjectproperty(nonatomic,copy)NSString*brand;property(nonatomic,copy)NSString*model;-(void)drive;end//拓展#importFoundation/Foundation.h#importfkcar.hNS_ASSUME_NONNULL_BEGINinterfacefkcar()property(nonatomic,copy)NSString*color;-(void)drive:(NSString*)owner;end#importfkcardrive.himplementationfkcar-(void)drive{NSLog(%汽车正在路上奔驰,self);}-(void)drive:(NSString*)owner{NSLog(%正在驾驶%汽车在路上奔驰,owner,self);}-(NSString*)description{return[NSString stringWithFormat:fkcar[_brand %, _model %, _color %],self.brand,self.model,self.color];}end//主函数fkcar*car[[fkcar alloc]init];car.brand宝马;car.modelx5;car.color黑色;[car drive];[car drive:开开心心];四、协议与委托协议规定一个类必须做什么但不限定怎么做使用protocol声明protocol协议名父协议1,父协议2{零到多个方法定义}使用类别实现非正式协议#importFoundation/Foundation.hinterfaceNSObject(Eatable)-(void)taste;end#importNSObjectEatable.hinterfaceFKApple:NSObjectend#importFKApple.himplementationFKApple-(void)taste{NSLog(苹果营养丰富口味很好);}end#importFoundation/Foundation.h#importFKApple.hintmain(intargc,char*argv[]){autoreleasepool{FKApple*app[[FKApple alloc]init];[app taste];}}正式协议protocolFKOutput-(void)output;-(void)addData:(NSString*)msg;end#importFoundation/Foundation.hprotocolFKProductable-(DSDate*)getProduceTime;end#importFoundation/Foundation.h#importFKOutput.h#importFKProductable.hprotocolFKPrintableFKOutput,FKProductable-(NSString*)printColor;end遵守协议#importFKPrinter.h#defineMAX_CACHE_LINE10implementationFKPrinter{NSString*printData[10];intdataNum;}-(void)output{while(dataNum0){NSLog(use%打印:%,self.printColor,printData[0]);dataNum--;for(inti0;idataNum;i){printData[i]printData[i1];}}}-(void)addData:(NSString*)msg{if(dataNumMAX_CACHE_LINE){NSLog(输出队列已满);}else{printData[dataNum]msg;}}-(NSData*)getProduceTime{return[[NSData alloc]init];}-(NSString*)printColor{return红色;}end;1、optional位于该关键字只后、required或end之前声明的方法是可选的实现类可选择是否实现这些方法。2、required位于该关键字之后、 optional 或end之前声明的方法是必需的实现类必需实现这些方法。协议与委托协议体现的是一种规范定义协议的类可以把协议定义的方法委托给实现协议的类这样可以让类定义具有更好的通用性因为具体的动作将由该协议的实现类去完成。无论是基于 Mac 的Cococa应用开发还是iOS开发各种应用程序大量依赖委托这个概念。