self访问成员变量
- <font color=purplepink>
成员变量是定义在类中的变量,它可以被所在类的方法所调用,而局部变量是定义在方法中的变量,当局部变量的名称与成员变量名相同时,局部变量将覆盖成员变量,导致无法访问成员变量.为了解决这个问题,OC提供了一个self关键字,它可以访问成员变量,解决局部变量与成员变量名称冲突的问题.
</font> - <font color=yellowred>
当使用self访问成员变量时,由于self本身是一个指向当前对象的指针,因此,它其实就是调用self所在方法的一个对象.
</font>
self调用方法
- <font color = blackblue>
对象方法中的self指向的是对象,所以只能代用对象方法;而类方法中的self指向的是类,所以只能调用类方法.
</font> - <font color = bluepink>
self调用方法的时候注意避免调用方法自己,若一个方法中利用self调用方法本身,则会造成死循环,影响程序正常使用.
</font>
点语法
- <font color = pinkgreen>
当使用点语法获取值的时候,系统会调用相关的get方法,默认的get方法名为点以后的字符.当使用点语法给变量赋值时,会调用set方法,默认的set方法名为点以后的字符首字母大写并在前面加一个set.
</font> - <font color = yellowpink>
点语法可以实现set和get方法的调用.点语法的本质是set、get方法.
</font> - <font color = red>
在使用点语法的时候不能在set、get方法中使用点语法,负责会造成循环引用.因为执行代码self.xx = xx时,等价于[self setXx:xx],这样就会重复循环调用setXx方法,造成死循环.同理,当执行代码"return self.xx"时,也会造成循环引用,只不过程序卡在setXx方法中,不能往下一步正常运行了.所以在set,get方法中避免使用点语法.
</font>
属性
以@property关键字声明的属性替代了成员变量的声明
,以及set和get方法的声明
有效减少了代码.
声明属性的特性:
- <font color = redy>
原子性:默认情况下,属性是atomic的,表示具有原子性,所以由编译器生成的set和get方法提供了健全的在多线程的环境中访问属性的功能,get方法的返回值或通过set方法设置的值可以完全不受其它线程执行的影响,而进行设置.但是如果将属性的特性设置为nonatomic,则标明set和get方法是非原子操作的,它不使用同步锁,所以也就不能保证set和get方法不受其他线程的影响.
</font> - <font color = yellowred>
读写权限:Readwrite和Readonly这两个特性控制编译器是否让属性自动生成set方法,它们两个是互斥的.
1.Readwrite:用于标识一个属性是可读写的,这个特性是默认的,标明@implementation中需要同时实现set和get方法;如果在实现中使用了@synthesize指令,那么set和get方法由编译器自动生成.
2.Readonly:用来标识一个属性是只读的,并且在@implementation中仅需要实现一个get方法.如果在实现中使用了@synthesize指令,那么编译器只会生成get方法;另外,如果代码中使用点语法进行赋值,编译器会报错.
</font>
- 一个属性的访问和存储方法默认是propertyName和setPropertyName.(name setName).
- 如果某些属性是Boolean类型,则需要在get方法上添加is作为前缀.demo:@property(nonatomic, getter = isOn) BOOL on;
set语义
- strong:此特性用于标明属性定义了一种"所属关系",为这种属性设置新值时,设置方法会保留新值并释放旧值,然后再将新值设置上去.
- weak:此方法定义了一种非所属关系,为这种属性设置新值时,设置方法不会保留新值,也不释放旧值,此类特性与assign相似,如果目标对象被取消,那么属性值会自动设为nil.
- copy:标明在分配对象时会进行复制,并向原来的对象发送一个release消息,复制消息是通过调用copy方法实现的,这个特性只有在属性是一个特性时有效,并且这个对象要实现NSCopying协议.
- assign:标明set方法使用简单的内存分配,这个特性是默认的,一般是针对数值进行的赋值操作.
- retain:此特性所表达的所属关系与strong相似,然后设置方法不会保留新值.当属性类型为NSString类型时,经常用此特性来保护其封装性,传递给设置方法的新值可能指向一个NSMutableString类的实例,这个类表示可以修改其值的字符串.
实现属性
属性的实现是通过@synthesize实现的.demo:@synthesize 变量名= _变量名.
用来通知编译器生成没有在@implementation中实现set和get方法,如果没有为属性标记为@synthesize,那么必须为这个属性实现set和get方法,否则编译器会报错.