现在的位置: 首页 > 综合 > 正文

objective-c快速入门教程(四)

2016年05月27日 ⁄ 综合 ⁄ 共 2705字 ⁄ 字号 评论关闭

到这里我们需要了解oc的类构成、以及重要的关键字

@interface

@end

在这两个@里面的是oc .h中类的声明格式

在.m中要这样写

@implement

@end

这个里面写类的实现。

习惯了java的我觉得这样写十分费劲,声明又实现的。

@interface既然不是接口(接口的声明 @protocol) 一肚子鄙夷的话暗自骂过,但是谁叫人家这样规定的呢、咱们程序员只能学习接受。

 

好了这里要解释第一个教程中所说的自动声明get set方法

@property是在头文件.h中声明一个变量的setter和getter方法。
@synthesize是在m文件中定义setter和getter方法的实现。

在声明这些属性的时候同时你还要赋予其各自的属性和权限。

Objective-C 属性特性(assign , retain , copy , readonly , readwrite , atomic , nonatomic,strong weak)

assign: 简单赋值,不更改索引计数。对基础数据类型 (例如NSInteger)和C数据类型(int, float, double, char, 等)     适用简单数据类型

retain:释放旧的对象,将旧对象的值赋予输入对象,再提高输入对象的索引计数为1,对其他NSObject和其子类

copy:建立一个索引计数为1的对象,然后释放旧对象对NSString 它指出,在赋值时使用传入值的一份拷贝。拷贝工作由copy方法执行,此属性只对那些实行了NSCopying协议的对象类型有效。更深入的讨论,请参考“复制”部分。

 

retain:释放旧的对象,将旧对象的值赋予输入对象,再提高输入对象的索引计数为1
对其他NSObject和其子类
readonly此标记说明属性是只读的,默认的标记是读写,如果你指定了只读,在@implementation中只需要一个读取器。或者如果你使用@synthesize关键字,也是有读取器方法被解析。而且如果你试图使用点操作符为属性赋值,你将得到一个编译错误。
readwrite此标记说明属性会被当成读写的,这也是默认属性。设置器和读取器都需要在@implementation中实现。如果使用@synthesize关键字,读取器和设置器都会被解析
nonatomic:非原子性访问,对属性赋值的时候不加锁,多线程并发访问会提高性能。如果不加此属性,则默认是两个访问方法都为原子型事务访问。
atomic:设置成员变量的@property属性时,默认为atomic,提供多线程安全 与上文正好相反。

strong weak
strong与weak是由ARC新引入的对象变量属性
ARC引入了新的对象的生命周期限定,即零弱引用。如果零弱引用指向的对象被

deallocated的话,零弱引用的对象会被自动设置为nil。
强引用与弱引用的广义区别:
强引用也就是我们通常所讲的引用,其存亡直接决定了所指对象的存亡。如果不

存在指向一个对象的引用,并且此对象不再显示列表中,则此对象会被从内存中

释放。
弱引用除了不决定对象的存亡外,其他与强引用相同。即使一个对象被持有无数

个若引用,只要没有强引用指向他,那么其还是会被清除。
简单讲,strong等同retain,weak比assign多了一个功能,当对象消失后自动把

指针变成nil。

 

self 关键字 :类似于java中的this,是隐藏参数,指向当前调用方法的类。
super 关键字 :调用父类的方法。

基本介绍完毕,我们还需要了解下oc中的---协议@protocol  @required

这个协议就是学习过java的同学所熟悉的interface  (接口)

很奇怪吧。似的在oc里面就是这样定义的 而我们熟悉的class  

在oc中表示引入某个对象的类  @class 与  #import类似

一、什么是协议?
  1.协议声明了可以被任何类实现的方法
  2.协议不是类,它是定义了一个其他对象可以实现的接口
  3.如果在某个类中实现了协议中的某个方法,也就是这个类实现了那个协议。
  4.协议经常用来实现委托对象。一个委托对象是一种用来协同或者代表其他对象的特殊对象。
  5:委托,就是调用自己定义方法,别的类来实现。

大大可以理解为,只要大家遵循同一个协议,这样就可以被特定的方法所处理了。

也可以理解为一种特别的多继承。

二、格式
协议

@protocol 协议名称
// 方法声明列表
@end
某个类遵守某个协议
@interface 类名 : 父类 <协议名称>
@end
某个协议遵守某个或者某些协议,一个协议可以遵守其他多个协议,
多个协议之间用逗号 , 隔开。
 @protocol 协议名称 <其他协议名称1, 其他协议名称2>
 @end
定义变量时,限制这个变量保存的对象遵守某个协议
 类名<协议名称> *变量名;
 id<协议名称> 变量名;
 NSObject<MyProtocol> *obj;
 id<MyProtocol> obj2;
@property中声明的属性也可用做一个遵守协议的限制
 一种是通过#import方式引入
 @property (nonatomic, strong) 类名<协议名称> *属性名;
 @property (nonatomic, strong) id<协议名称> 属性名;
 @property (nonatomic, strong) Dog<MyProtocol> *dog;
 @property (nonatomic, strong) id<MyProtocol> dog2;

三、协议里的关键字
协议中有2个关键字可以控制方法是否要实现(默认是@required),在大多数情况下,
用途在于程序员之间的交流
@required:这个方法必须要实现(若不实现,编译器会发出警告)
@required
- (void)test;
- (void)test2;
@optional:这个方法不一定要实现
@optional
- (void)test3;
四、基协议

NSObject是一个基类,最根本最基本的类,任何其他类最终都要继承它
其实还有一个协议,名字也叫NSObject,它是一个基协议,最根本最基本的协议
NSObject协议中声明很多最基本的方法,比如description、retain、release等
建议每个新的协议都要遵守NSObject协议
 五、注意点:

协议可用定义在单独.h文件中,也可用定义在某个类中
 1> 如果这个协议只用在某个类中,应该把协议定义在该类中
 2> 如果这个协议用在很多类中,就应该定义在单独文件中
 分类可用定义在单独.h和.m文件中,也可用定义在原来类中
  一般情况下,都是定义在单独文件
  定义在原来类中的分类,只要求能看懂语法

 

抱歉!评论已关闭.