黑马程序员_OC特有语法
2014-06-17 00:45
204 查看
---------------------- ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------
其实点语法的本质还是方法调用,当使用点语法的时候,编译器会自动展开成相应的方法。
p.age = 10;
展开为
[p setAge:10];
int age = p.age;
展开为
int age = [p age];
而现在的@property直接包含了@synthesize的功能,更加简洁了
> retain : release旧值,retain新值(适用于OC对象类型)
> assign : 直接赋值(默认,适用于非OC对象类型)
> copy : release旧值,copy新值
2.是否要生成set方法
> readwrite : 同时生成setter和getter的声明、实现(默认)
> readonly : 只会生成getter的声明、实现
3.多线程管理
> nonatomic : 性能高 (一般就用这个)
> atomic : 性能低(默认)
4.setter和getter方法的名称
> setter : 决定了set方法的名称,一定要有个冒号 :
> getter : 决定了get方法的名称(一般用在BOOL类型)
构造方法
构造方法:用来初始化对象的方法
重写构造方法的目的:为了让对象创建出来,成员变量就会有一些固定的值
之后进行子类成员变量的初始化
Person *p2 = [p1 init]; 初始化
Person *p3 = [[Person alloc]init]; 把两步一起进行
@interface 类名 (分类名)
@end
2.分类方法实现中可以访问原来类中声明的成员变量
3.分类可以重新实现原来类中的方法,但是会覆盖掉原来的方法,会导致原来的方法没法再使用
4.方法调用的优先级:分类(最后参与编译的分类优先) --> 原来类 --> 父类
只是将原来类的方法进行模块化管理,而继承是新建一个类,这个类可以拥有父类的方法和不是私有成员的变量,
还可以在原来的基础上增加成员变量和方法;
(2)在category中对原有类的方法进行重载,会覆盖原来的方法,会导致原来方法失效无法再使用,而在
继承中实现父类方法的重载时可以使用super调用父类的方法;
(3)category是可以被继承的。在某个父类中定义了category,那么他所有的子类都具有该category;
// 方法声明列表....
@end
@interface 类名 : 父类名 <协议名称1, 协议名称2>
@end
2> 协议遵守协议
@protocol 协议名称 <其他协议名称1, 其他协议名称2>
@end
要求实现,如果没有实现,会发出警告
2> @optional
不要求实现,怎样不会有警告
一些使用
定义一个变量的时候,限制这个变量保存的对象遵守某个协议
类名<协议名称> *变量名;
id<协议名称> 变量名;
NSObject<MyProtocol> *obj;
id<MyProtocol> obj2;
如果没有遵守对应的协议,编译器会警告
@property中声明的属性也可用做一个遵守协议的限制
@property (nonatomic, strong) 类名<协议名称> *属性名;
@property (nonatomic, strong) id<协议名称> 属性名;
@property (nonatomic, strong) Dog<MyProtocol> *dog;
@property (nonatomic, strong) id<MyProtocol> dog2;
协议可用定义在单独.h文件中,也可用定义在某个类中
1> 如果这个协议只用在某个类中,应该把协议定义在该类中
2> 如果这个协议用在很多类中,就应该定义在单独文件中
7.分类可用定义在单独.h和.m文件中,也可用定义在原来类中
1> 一般情况下,都是定义在单独文件
2> 定义在原来类中的分类,只要求能看懂语法
---------------------- ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------详细请查看:http://edu.csdn.net
点语法
利用点语法替换set方法和get方法
方法调用
Person *p = [Person new]; [p setAge:20]; int age = [p age];
点语法
p.age = 20; int age = p.age;
其实点语法的本质还是方法调用,当使用点语法的时候,编译器会自动展开成相应的方法。
p.age = 10;
展开为
[p setAge:10];
int age = p.age;
展开为
int age = [p age];
注意死循环
- (void) setAge:(int)age{ //会引发死循环 // self.age = age; //上一句相当于[self setAge:age]; _age = age; }
-(int)age { //会引发死循环 //return self.age; //上一句相当于[self age]; return _age; }
@property 和 @synthesize
@property:可以自动生成某个成员变量的setter和getter声明@property int age;@synthesize自动生成age的setter和getter实现,并且会访问_age这个成员变量,如果不存在,就会自动生成@private类型的_age变量
而现在的@property直接包含了@synthesize的功能,更加简洁了
@property的相关参数
1.set方法内存管理相关的参数> retain : release旧值,retain新值(适用于OC对象类型)
> assign : 直接赋值(默认,适用于非OC对象类型)
> copy : release旧值,copy新值
2.是否要生成set方法
> readwrite : 同时生成setter和getter的声明、实现(默认)
> readonly : 只会生成getter的声明、实现
3.多线程管理
> nonatomic : 性能高 (一般就用这个)
> atomic : 性能低(默认)
4.setter和getter方法的名称
> setter : 决定了set方法的名称,一定要有个冒号 :
> getter : 决定了get方法的名称(一般用在BOOL类型)
@property(nonayomic,assign) int age;
构造方法
构造方法:用来初始化对象的方法重写构造方法的目的:为了让对象创建出来,成员变量就会有一些固定的值
注意
再重写init方法时要先调用父类的构造方法[super init]之后进行子类成员变量的初始化
创建对象方法
Person *p1 = [Person alloc] 分配储存空间Person *p2 = [p1 init]; 初始化
Person *p3 = [[Person alloc]init]; 把两步一起进行
重写init
- (id)init { if(self = [super init]){ _age = 20; } return self; }
分类
分类的作用
在不改变原来类内容的基础上,可以为类增加一些方法@interface 类名 (分类名)
@end
使用注意
1.分类只能增加方法,不能增加成员变量2.分类方法实现中可以访问原来类中声明的成员变量
3.分类可以重新实现原来类中的方法,但是会覆盖掉原来的方法,会导致原来的方法没法再使用
4.方法调用的优先级:分类(最后参与编译的分类优先) --> 原来类 --> 父类
分类与继承的区别
(1)category是在不改变原来类内容的基础上,为类增加一些方法,但不能增加成员变量,只是将原来类的方法进行模块化管理,而继承是新建一个类,这个类可以拥有父类的方法和不是私有成员的变量,
还可以在原来的基础上增加成员变量和方法;
(2)在category中对原有类的方法进行重载,会覆盖原来的方法,会导致原来方法失效无法再使用,而在
继承中实现父类方法的重载时可以使用super调用父类的方法;
(3)category是可以被继承的。在某个父类中定义了category,那么他所有的子类都具有该category;
协议
协议(protocol)是Objective-c中一个非常重要的语言特性,从概念上讲,非常类似于JAVA中接口. 一个协议其实就是一系列有关联的方法的集合(为方便后面叙述,我们把这个协议命名为myProtocol)。协议中的方法并不是由协议本身去实现,相反而是由遵循这个协议的其他类来实现。换句话说,协议myProtocol只是完成对协议函数的声明而并不管这些协议函数的具体实现协议的定义
@protocol 协议名称 <NSObject>// 方法声明列表....
@end
如何遵守协议
1> 类遵守协议@interface 类名 : 父类名 <协议名称1, 协议名称2>
@end
2> 协议遵守协议
@protocol 协议名称 <其他协议名称1, 其他协议名称2>
@end
协议中方法声明的关键字
1> @required (默认)要求实现,如果没有实现,会发出警告
2> @optional
不要求实现,怎样不会有警告
一些使用
定义一个变量的时候,限制这个变量保存的对象遵守某个协议类名<协议名称> *变量名;
id<协议名称> 变量名;
NSObject<MyProtocol> *obj;
id<MyProtocol> obj2;
如果没有遵守对应的协议,编译器会警告
@property中声明的属性也可用做一个遵守协议的限制
@property (nonatomic, strong) 类名<协议名称> *属性名;
@property (nonatomic, strong) id<协议名称> 属性名;
@property (nonatomic, strong) Dog<MyProtocol> *dog;
@property (nonatomic, strong) id<MyProtocol> dog2;
协议可用定义在单独.h文件中,也可用定义在某个类中
1> 如果这个协议只用在某个类中,应该把协议定义在该类中
2> 如果这个协议用在很多类中,就应该定义在单独文件中
7.分类可用定义在单独.h和.m文件中,也可用定义在原来类中
1> 一般情况下,都是定义在单独文件
2> 定义在原来类中的分类,只要求能看懂语法
---------------------- ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------详细请查看:http://edu.csdn.net
相关文章推荐
- 黑马程序员_OC的特有语法
- 黑马程序员——OC语言------OC特有语法:分类、description、类对象、SEL
- 黑马程序员—OC(归纳总结OC特有的语法)
- 黑马程序员_oc特有语法一:分类Category和类扩展
- 黑马程序员-OC语言基础:OC特有语法
- 黑马程序员---OC特有的语法
- 黑马程序员(OC特有语法-block和-Protocol)
- 黑马程序员 oc的特有语法
- 黑马程序员-IOS-OC基础-OC特有语法
- 黑马程序员--Objective-C——OC特有语法一
- 黑马程序员--Objective-C——OC特有语法二
- 黑马程序员——OC---OC特有语法01
- 黑马程序员_ios基础总结9_OC特有语法
- 黑马程序员--oc:特有语法1
- 黑马程序员——OC基础---OC特有语法
- 黑马程序员--oc:特有语法2
- 黑马程序员---OC特有语法(一)
- 黑马程序员-8-Objective-C学习笔记(OC特有语法)
- 黑马程序员---iOS-OC特有的语法1
- 黑马程序员——Objective-C语言知识点总结之OC特有语法