Objective-C关键字

原文:http://blog.sina.com.cn/s/blog_b6e3f371010199sa.html

NO.1: 关键字“NS”

      NSObject*anObject; (类名*对象名)--OC语言中NSNeXTSTEP)为现任苹果CEO,之前NeXTSTEP老板的乔布斯团队的用户界面工具包,并一直沿用至今。由于OC中所有对象的操作都是由指针来完成,所以我们可以见到代码中大部分都是指针。


NO.2:关键字“@property and @synthesize(存取器)”

    类的定义分为两个部分,接口部分(interface)和实现部分(implementation,接口部分声明了类中的属性和方法名,实现部分声明了属性,和方法的的定义。使用@property配合@synthesize可以让编译器自动实现getter/setter方法,使用的时候也很方便,可以直接使用对象.属性的方法调用一个方法并获取到方法的返回值

    1@property表示声明了对象的一个属性。例如:@property floatsmsHandling; 表示某个类的对象具有了一个float类型的名为smsHandling的属性。

property自动生成了-setsmsHandling -getsmsHandling两个方法来操作属性.


    2@synthesize表示创建该属性的访问器(Ps:-setsmsHandling -getsmsHandling两个方法是在这句存在的情况下才开始由编译器输出的).


NO.3:关键字“self and super”

  OC中有两个关键字可以在方法的实现中代表执行方法的对象: 

self:执行方法的对象本身。

      相当于c++中的this。 除了可以用作向自身请求方法以外,还可以作为一个代表属性本身的隐藏变量来使用 。它指向当前调用方法的类,另一个隐藏参数是_cmd,代表当前类方法的 selector

    下面有个小例子,让大家看看用self.和不用有何区别。

      在一个类当中,对于一个实例化的对象而言,如我们做如下声明 

 


      MyClass.h
      @interface MyClass :NSObject {   MyObject* _myObject; }

      @property(nonatomic, retain) MyObject *myObject;

     @end


那么“_myObject”才是代表属性本身,而“myObject”只是代表该属性的存取方法名。“myObbject”并不能直接访问属性的存取方法, 而“self.myObject”可访问属性的存取方法。


       MyObject *aMyObject = [[MyObject alloc] init]; //aMyObject retainCount= 1;

      //因为这里声明@property(nonatomic,retain)...所以"self."访问的存取方法是retain,即保留计数加1
       self.myObject = aMyObject;
//myObject retainCount =2;

       或者

      

       MyObject *aMyObject = [[MyObject alloc]init]; //aMyObject retainCount= 1;

       _myObject =aMyObject;//myObject retainCount =1;

   


super:调用对象的父类中的实现来执行方法 

      只能出现在消息表达式中,代表了对被复写的方法的原始实现的请求方式。它是一个编译器指示符”。


super和self相同的地方是,它们指向的是相同的消息接收者。不同的是,当使用 self 调用方法时,会从当前类的方法列表中开始找,如果没有,(向上到父亲类中寻找)再一层一层向上寻找;而当使用 super 时,直接从父类的方法列表中开始寻找,如果没有,再一层一层向上寻找


 


NO.4:关键字“alloc  andinit”

   O-C中对象的创建需要两个部分,第一:内存分类(Allocation)。第二:对对象进行初始化(initialization)。而我们一般将这两步在同一个语句中实现。

    alloc是分配动作,是从操作系统获得一块内存并将其指定为存放对象的实例变量的位置。同时,init方法将这块内存区域全部初始化为0如果初始化方法有可能返回nil,则还需要做检查处理。


1、自定义初始化方法的命名一般应以“init”开头。 

2、初始化方法的返回值类型必须是id。

3、在自定义初始化方法的实现中,必须有对本类的指定初始化方法的引用 

4、在实现中引用其它初始化方法时,注意把返回值赋给self。

5、在对实例变量赋值时,进行直接访问,而不是透过访问器 

6、在实现的最后返回self,如果初始化过程失败,则返回nil。

 

NO.5:关键字:“@property(*)括号中的属性内容

readonly

此标记说明属性是只读的,默认的标记是读写,如果你指定了只读,在@implementation中只需要一个读取器。或者如果你使用@synthesize关键字,也是有读取器方法被解析。而且如果你试图使用点操作符为属性赋值,你将得到一个编译错误。

readwrite

此标记说明属性会被当成读写的,这也是默认属性。设置器和读取器都需要在@implementation中实现。如果使用@synthesize关键字,读取器和设置器都会被解析。

assign

使用assign:仅仅针对对基础数据类型NSIntegerCGFloat)和C数据类型(int,float, double, char, 等等),即不能用于对象。简单的赋值,不更改引用计数。为了解决基本数据类型与循环引用问题而设计。

此标记说明设置器直接进行赋值,这也是默认值。在使用垃圾收集的应用程序中,如果你要一个属性使用assign,且这个类符合NSCopying协议,你就要明确指出这个标记,而不是简单地使用默认值,否则的话,你将得到一个编译警告。这再次向编译器说明你确实需要赋值,即使它是可拷贝的。

retain

NSObject和其子类。始终为浅复制,保留计数加1必须保持该对象时用到。

指定retain会在赋值时唤醒传入值的retain消息。此属性只能用于Objective-C对象类型,而不能用于CoreFoundation对象。(原因是,retain会增加对象的引用计数,而基本数据类型或者CoreFoundation对象不存在引用计数的说法)

copy

使用copy NSObject和其子类。对于可变对象,为深复制,引用计数不加1对参数进行release旧值再retain新值;对于不可变对象,为浅复制,保留计数加1。(注:所以对于不可变对象的浅复制一般用retain,这也是为什么网上很多朋友简单的误认为copy是深复制的原因之一)。

它指出,在赋值时使用传入值的一份拷贝。拷贝工作由copy方法执行,此属性只对那些实行了NSCopying协议的对象类型有效。为了减少对上下文的依赖而引入的机制(主要针对可变对象)。注意copy始终返回一个不可变对象。

 

nonatomic

指出访问器不是原子操作,而默认地,访问器是原子操作。这也就是说,在多线程环境下,解析的访问器提供一个对属性的安全访问,从获取器得到的返回值或者通过设置器设置的值可以一次完成,即便是别的线程也正在对其进行访问。如果你不指定nonatomic,在自己管理内存的环境中,解析的访问器保留并自动释放返回的值,如果指定了nonatomic,那么访问器只是简单地返回这个值。

其实这是为了禁止使用mutex(互斥)锁保护属性存取器方法。编写线程安全代码的人会使用mutex锁定来防止同一代码中的两个线程同时执行,如果同时执行会导致可怕的问题。然而这种锁定也会让程序变慢。如果未指定nonatomic或者指定了atomic(默认),那么会使mutex锁定保护实例变量,即能提高多线程性能

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值