xcode6.1-objective-c新版特性

上传人:xiao****1972 文档编号:84907497 上传时间:2019-03-05 格式:DOC 页数:18 大小:189.83KB
返回 下载 相关 举报
xcode6.1-objective-c新版特性_第1页
第1页 / 共18页
xcode6.1-objective-c新版特性_第2页
第2页 / 共18页
xcode6.1-objective-c新版特性_第3页
第3页 / 共18页
xcode6.1-objective-c新版特性_第4页
第4页 / 共18页
xcode6.1-objective-c新版特性_第5页
第5页 / 共18页
点击查看更多>>
资源描述

《xcode6.1-objective-c新版特性》由会员分享,可在线阅读,更多相关《xcode6.1-objective-c新版特性(18页珍藏版)》请在金锄头文库上搜索。

1、XCode6.1-Objective-C新版特性一、 XCode6.1中的Objective-C新特性:1. instancetype关键字:1) id类型:id类型对于Oc来讲,是一种万能类型,可以把所有的继承自NSObject的对象,转换成id类型。但id类型本身并不检查对象的真实类型,导致在编译时并不检查调用的方法是否为该类的成员方法,而在运行时可能会引起异常。如以下实际代码:头文件中:interface IdAndInstancetype : NSObject+(id) ObjectFactoryID;/静态工厂方法,返回id类型的对象指针end源文件中:implementation

2、IdAndInstancetype+(id) ObjectFactoryID return self class alloc init;end在main函数中使用该方法:id objID = IdAndInstancetype ObjectFactoryID init; objID count;缺陷:以上代码在编译时,调用count方法这一句并不会给出警告或错误,因为id类型并不检查对象的实际类型。而在运行时由于对象实际上是IdAndInstancetype类型的,但它内部并没有count方法,因此会报出异常错误中断程序的运行!2) instancetype类型:定义:instancetype

3、类型是新版本Oc中增加的关键字,它的含义是实例对象的实际类型。编译器会在将某对象的类型为instancetype时,会自动转换为该实例的“真正类型”。注意,instancetype只应该在alloc、init和工厂方法的返回值类型中使用,不要再其它的代码中用它。比如这样使用instancetype是不正确的:instancetype obj;/编译错误,instancetype不是真正的“类型”id obj;/正确,id是一种类型instancetype的一般用法:头文件中添加新的工厂方法:interface IdAndInstancetype : NSObject+(id) ObjectFa

4、ctoryID;+(instancetype) ObjectFactoryInstancetype;-(void) methodFather;/添加一个父类的成员方法end原文件中添加方法的实体:+(instancetype) ObjectFactoryInstancetype return self class alloc init;/同时也添加父类成员方法的实体-(void) methodFather NSLog(%, super class method!);注意:上述代码中的self class,据官方文档说明,class方法会返回“类对象”,代表了当前对象所属的类。在main函数中使

5、用时:A、错误用法:IdAndInstancetype ObjectFactoryInstancetype count;会提示IdAndInstancetype没有count成员的编译错误!B、正确用法:假设有子类名叫SubClass,它继承了IdAndInstancetype的工厂方法,并且有自己的成员方法:头文件:interface SubClass : IdAndInstancetype-(void) methodSon;end源文件:implementation SubClass-(void) methodSon NSLog(%, sub class method!);endmain函

6、数中:IdAndInstancetype ObjectFactoryInstancetype methodFather;/该工厂方法会返回父类型,因此不能够访问子类的成员方法methodSonSubClass ObjectFactoryInstancetype methodSon;/该工厂方法会返回子类型,因此够访问父类和子类的成员方法methodFather 、methodSon2. property关键字1) 定义:property是用来捕获对象的状态。它们反射出对象的内在属性以及和其他对象的关系。它提供了一个安全的、便捷的方法,以便我们访问对象的属性,而不需要写出各种访问方法(gette

7、r、setter)。使用property关键字有以下几点好处:自动的实现getter和seeter方法:当你声明了property时,会自动的实现getter和setter方法而不用自己写出来。使用该关键字使得目的非常明确,就是用来进行数据封装并提供访问接口的。property关键字可以通过一系列附加信息,来方便的约束属性的行为。比如提供了各种附加声明如assign、copy、weak、strong、atomic、nonatomic等。2) property附加声明的作用,见下述说明:property与synthesize是成对出现的,可以自动生成某个类成员变量的存取方法。在Xcode4.5以

8、及以后的版本,synthesize可以省略。附加属性的约束:atomic与nonatomicatomic:默认是有该属性的,这个属性是为了保证程序在多线程情况,编译器会自动生成一些互斥加锁代码,避免该变量的读写不同步问题。nonatomic:如果该对象无需考虑多线程的情况,请加入这个属性,这样会让编译器少生成一些互斥加锁代码,可以提高效率。readwrite与readonlyreadwrite:这个属性是默认的情况,会自动为你生成存取器。readonly:只生成getter不会有setter方法。readwrite、readonly这两个属性的真正价值,不是提供成员变量访问接口,而是控制成员变

9、量的访问权限。strong与weakstrong:强引用,也是我们通常说的引用,其存亡直接决定了所指向对象的存亡。如果不存在指向一个对象的引用,并且此对象不再显示在列表中,则此对象会被从内存中释放。weak:弱引用,不决定对象的存亡。即使一个对象被持有无数个弱引用,只要没有强引用指向它,那么还是会被清除。strong与retain功能相似;weak与assign相似,只是当对象消失后weak会自动把指针变为nil;assign、copy、retainassign:默认类型,setter方法直接赋值,不进行任何retain操作,不改变引用计数。一般用来处理基本数据类型。retain:释放旧的对象

10、(release),将旧对象的值赋给新对象,再令新对象引用计数为1。我理解为指针的拷贝,拷贝一份原来的指针,释放原来指针指向的对象的内容,再令指针指向新的对象内容。copy:与retain处理流程一样,先对旧值release,再copy出新的对象,retainCount为1.为了减少对上下文的依赖而引入的机 制。我理解为内容的拷贝,向内存申请一块空间,把原来的对象内容赋给它,令其引用计数为1。对copy属性要特别注意:被定义有copy属性的对象必须要 符合NSCopying协议,必须实现- (id)copyWithZone:(NSZone *)zone方法。也可以直接使用:使用assign:

11、对基础数据类型 (NSInteger,CGFloat)和C数据类型(int, float, double, char, 等等)使用copy: 对NSString使用retain: 对其他NSObject和其子类3) property特别注意的几点:作为getter setter:getter:是用来指定get方法的方法名setter:是用来指定set访求的方法名在property的属性中,如果这个属性是一个BOOL值,通常我们可以用getter来定义一个自己喜欢的名字,例如:property (nonatomic, assign, getter=isValue) boolean value;p

12、roperty (nonatomic, assign, setter=setIsValue) boolean value;getter和setter的命名规则:假设PropertyTest类中有以下属性:头文件:interface PropertyTest : NSObjectproperty (nonatomic) NSString * name;end源文件:implementation PropertyTestend注意,从XCode4.5开始原文件中不需要再显式地写出synthesize。不写出synthesize时,编译器会给出默认的方法,按照默认的命名规则给getter和sette

13、r命名:按照示例,默认的setter为name,getter为getName,默认的私有数据为:NSString * _name。另外,再次强调,boolean类型的属性,默认的getter命名不够直接,我们可以给其getter之前添加“is”,如:property (assign, getter=isEmpty) Boolean empty;在使用时,就非常一目了然了:if(property.isEmpty = YES) NSLog(%, is empty!);上述的方法,也就是修改默认method命名的方法。在新版的Oc中,synthesize的作用只是用来修改默认的私有数据名称用。如下述

14、示例:源文件:implementation PropertyTestsynthesize name = myName;-(void) changeName : (NSString *) _name self-myName = _name;end上面代码中的synthesize作用是给属性name的真实数据命名为myName,若不写出,按照命名规则默认的数据名称为_name。4) strong、weak、assign的区别和验证:头文件中:interface StrongAndWeak : NSObjectproperty (strong) NSString * str;property (strong) NSString * strStrong;property (weak) NSString * strWeak;property (assign) NSString * strAssign;end验证weak:int main(int argc, const char * argv) StrongAndWeak * obj; autoreleasepool / insert code here. obj = StrongAndWeak alloc init; obj.str = NSString alloc initWithUTF8String:aha; obj

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 大杂烩/其它

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号