美文网首页
关键字&&属性

关键字&&属性

作者: 酸菜菜 | 来源:发表于2018-07-17 12:41 被阅读5次

#import

导入接口,确保同一个文件永远不会被包含多次;比#include的好处就是不会引起重复包含(交叉编译)

#include

导入接口

@class

一般用于头文件中需要声明该类的某个实例变量的时候用到。

@interface

类接口的声明以编译器指令开头 @interface 并以 指令结束 @en􏰀d。

@property

声明属性

+     - 

+ 类对象,类方法可以使用的方法的名称,前面加 一个加号 +

-  类实例可以使用的方法,实例方法,标有减号 -

@implementation

类接口的实现

@synthesize

如果不在@implementation块中提供属性,则使用 该指令告诉编译器它应该为属性合成setter和/或 getter方法。@sy􏰀thesize如果没有声明,该指令 还会合成一个适当的实例变量。 无论是否指定实例变量的名称,该@sy􏰀thesize指 令只能使用当前类的实例变量,而不能使用超 类。

@dynamic

使用@dynamic关键字告诉编译器您将通过直接提 供方法实现或在运行时使用其他机制(如动态加 载代码或动态方法解析)来实现属性隐含的API契 约。它会抑制编译器在无法找到合适的实现时会 产生的警告。只有在知道方法在运行时可用时才 应使用它。

要点:如果未指定@sy􏰀thesize或@dynamic为特定属性 指定,则必须为该属性提供getter和setter(或者 只是readonly属性的getter )方法实现。如果不这 样做,编译器会生成警告。

@private

实例变量 只能在声明它的类中访问。

@protected

实例变量可以在声明它的类中以及继承它的类中 访问。没有显式范围指令的所有实例变量都有 @protected范围。

@public

实例变量随处可访问。

@package

实例变量可以在包内部访问,一个项目一定是在同一个包下。

@protocol

协议名

@required

必须实现的协议方法(默认)

@optional

将协议方法标记为可选

属性

访问者方法名称

getter=getterName

指定属性的get访问器的名称。getter必须返回与 属性类型匹配的类型,并且不带参数。

setter=setterName

指定属性的set访问器的名称。setter方法必须采用 与属性类型匹配的类型的单个参数,并且必须返 回v􏰄id。如果指定属性read􏰄􏰀􏰁y并且还指定了setter setter=,则会收到编译器警告。 通常,您应指定符合键值编码的访问者方法名称 (请参阅键值编码编程指南) - 使用getter装饰器 的常见原因是遵守布尔值的isPr􏰄􏰃ertyNa􏰂e约定。

可写

readwrite

指示应将该属性视为读/写。此属性是默认值。 @implementation􏰄􏰀块中需要getter和setter方法。 如果@sy􏰀thesize在实现块中使用该指令,则会合 成getter和setter方法。

此属性是默认值, 会自动为你生成存取器。

readonly

表示该属性是只读的。 如果指定readonly,则@implementation􏰄􏰀块中只需 要getter方法。如果@sy􏰀thesize在实现块中使用 该指令,则仅合成getter方法。此外,如果您尝试 使用点语法分配值,则会出现编译器错误。

只生成getter不会有setter方法。

set的语义学

strong

强引用,也是我们通常说的引用,其存亡直接决定了所指向对象的存亡。如果不存在指向一个对象的引用,并且此对象不再显示在列表中,则此对象会被从内存中释放。

strongretain功能相似;

weak

弱引用,不决定对象的存亡。即使一个对象被持有无数个弱引用,只要没有强引用指向它,那么还是会被清除。 

weakassign相似,只是当对象消失后weak会自动把指针变为nil;

(OS X v10.6和iOS 4不支持弱属性;请assig􏰀改 用。)

assign

默认类型,setter方法直接赋值,不进行任何retain操作,不改变引用计数。一般用来处理基本数据类型。例如NSI􏰀teger和 CGRect。

retain

释放旧的对象(release),将旧对象的值赋给新对象,再令新对象引用计数为1。

指定retai􏰀n在赋值时应在对象上调用。 先前的值会发送一条re􏰁ease消息。

在OS X v10.6及更高版本中,您可以使用该 __attribute__关键字指定应将Co􏰄re F􏰄oun􏰀dation􏰄􏰀属性 视为用于内存管理的Objective-C对象: 

@􏰃prop􏰄􏰃erty(retai􏰀n􏰀)__ attribute __ ((NSObject))CFDicti􏰄􏰀onaryRef 􏰂myDicti􏰄􏰀onary;

copy

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

原子性

nonatomic

指定访问者是非原子的。默认情况下,访问器是原子的。

-----------------------------------------

如果该对象无需考虑多线程的情况,请加入这个属性,这样会让编译器少生成一些互斥加锁代码,可以提高效率。

当一个变量声明为nonatomic时,意味着多个线程可以同时对其进行访问;它是非线程安全型,访问速度快;当两个不同的线程对其访问时,容易失控。

atomic

默认情况下,属性是合成访问器提供对多线程环境中属性的强大访问 - 也就是说,无论其他线程 同时执行什么,始终完全检索或设置从getter返回 的值或通过setter设置的值。如果指定strong, copy或者retain􏰀未指定nonatomic,则在引用计数环境中, 对象属性的合成get访问器使用锁并保留并自动释放返回的值

- 实现将类似于以下内容:

[_内锁]; //使用对象级锁定锁定

id resu􏰁t = [[retai􏰀 retain􏰀] aut􏰄re􏰁ease];

[_内部解锁];

返回结果; 如果指定􏰀􏰄􏰀atomic,则对象属性的合成访问器只是直接返回值。

-----------------------------------------

这个属性是为了保证程序在多线程情况,编译器会自动生成一些互斥加锁代码,避免该变量的读写不同步问题。

当一个变量声明为atomic时,意味着在多线程中只能有一个线程能对它进行访问;该变量为线程安全型,但是会影响访问速度;在非ARC编译环境下,需要设置访问锁来保证对该变量进行正确的get/set加了atomic,setter函数会变成下面这样:

if (property != newValue) {

    [property release];  

    property = [newValue retain];  

}

@encode

@encode为编译器宏,它可以将类型转换为响应 的字符串。

id

可以调用任何对象方法,不能进行编译检测(运 行时容易找不到方法)。 id是指向 Objective-C类对象的指针,它可以声明为任何类 对象的指针,当在Objective-C中应用id时,编译 器会假定你知道,id指向哪个类的对象。与vo􏰄id是不同的是,vo􏰄id编译器不知道也不假定指向任何类型的指针。

nil􏰁 

定义为一个常量,若是一个指针的值为􏰀nil􏰁,代表这个指针没有指向任何对象。

self

在Objective-C中,关键字se􏰁f与c++中this是同一 概念,就是类对象自身的地址,经由过程self可以 调用本身的实例变量和办法

Super

当子类须要调用父类的办法时,会用到Super关键 字. Super指向的是父类的指针,子类重写父类的 办法时,调用父类的办法是一个非常好的习惯。 因为当我们不知道父类在该办法中实现的功能 时,若是不调用父类的办法,有可能我们重写的 办法会落空该功能,这是我们不想看到的景象。

NSNull

NSNull是没有的意思,若是一个字典的值为 NSNull􏰁􏰁,那申明与该值对应的Key是没有值的,例 如Key为address,声明与address对应的是值是没有。

instancetype

自动识别当前类的对象 x􏰄code 5

__kindof

表示相当于当前类或者他的子类

参考文档:

https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/ObjectiveC/Chapters/ocDefiningClasses.html#//apple_ref/doc/uid/TP30001163-CH12-SW1

相关文章

网友评论

      本文标题:关键字&&属性

      本文链接:https://www.haomeiwen.com/subject/chmwpftx.html