------- IOS培训、android培训、期待与您交流! ----------
不管是在Java中还是在C#中这些面向对象的语法,我们经常使用对象.成员变量的方式,来很方便的操作。
也许是为了让更多地习惯这种操作的程序员们,OC中也引入了点语法。
@property有以下几种属性
readwrite 默认
assign 默认
readonly 只读(只有get方法,禁用set方法)
给setter和getter方法起别名(setter = a:, getter = b)
atomic 开启多线程变量保护,会消耗一定的资源(非原子性,保证多线程安全)
nonatomic:禁止多线程变量保护,提高性能
assign:直接赋值,适用于基本数据类型(非对象类型)
retain:赋值时做内存优化,使用于对象类型
copy:复制一个副本,适用于特殊的对象类型(常用于NSstring)(有NSCoping协议的才可以用copy)
1.先来看一下刚刚学习时,我们经常见到的代码:
类的声明:
#import <Foundation/Foundation.h>
@interface Cat: NSObject {
int age;
}
- (void)setAge:(int)newAge;
- (int)age;
@end
类的实现:
#import "Cat.h"
@implementationCat
- (void)setAge:(int)newAge {
age = newAge;
}
- (int)age {
return age;
}
@end
在通常情况下,我们在Main函数中经常如下使用:
#import <Foundation/Foundation.h>
#import "Cat"
int main(int argc, const char * argv[])
{
@autoreleasepool {
Cat *cat= [[Catalloc] init];
// 设置age的值
[cat setAge:10];
// 取出age的值
int age = [cat.age];
NSLog(@"age is %i", age);
}
return 0;
}
2. 其实我们不必这样麻烦,点语发,是可以代替上面的功能的,代码如下:
#import <Foundation/Foundation.h>
#import "Cat"
int main(int argc, const char * argv[])
{
@autoreleasepool {
Cat *cat= [[Catalloc] init];
// 设置age的值
cat.setAge=10;
// 取出age的值
int age = [cat.age];
NSLog(@"age is %i", age);
}
return 0;
}
这样应该看起来很亲切了吧,但是这种用法,是和上面Java以及C#中原理是不一样的。
这只是看起来像而已
OC点语法的本质是方法调用,不是直接访问成员变量。
如下分析,当使用点语法是,其实OC是将 左边的转换为右边的
cat.setAge=10; -------> [cat setAge:10];
int age = [cat.age]; -------> int age = [cat.age];
所以,我们应该记清楚,这用点语法,仅仅是方便我们使用而已。
3.需要注意一点的是,当self和 . 有时在一起使用时会遭成死循环。
例如:
- (void)setSpeed:(int)newSpeed
{
self.speed = newSpeed;
}
其实他会展开为:
[self setSpeed: newSpeed]
这样是不是就很明显了呢?