Objective-C 2.0中的属性机制为我们提供了便捷的获取和设置实例变量的方式也可以说属性为我们提供了一个默认的设置器和访问器的实现。在学习OC中属性之前我们先要知道为什么要为变量实现getter和setter方法我们先来了解一下实例的作用域。
实例变量的作用域如下
1. @public : 共有的该实例变量谁都可以访问
2.@protected 受保护的该实例变量只能在该类和其子类内访问父类protected的实例变量在子类中是private的默认是protected
3.@private: 私有的该实例变量只能在该类的内部访问
因为要用protected 或者 private来隐藏类的内部细节用类或者对象是没法直接访问被隐藏的细节的所以要用getter和setter来访问被隐藏的实例变量OC中的属性机制就为我们提供了默认的getter和setter方法。下面我们要学习一下OC中的属性机制。
属性的定义和实现
1.属性的定义
属性的定义用编译器命令@property来定义比如要为私有的变量 int a定义getter和setter方法@property int a; 用@property会自动的为修饰的变量加上
getter和setter方法。
Demo如下
1 2 3 4 5 6 7 8 9 10 11 | @interface Student : NSObject { NSString *name; int idNumber; } //定义属性 @property NSString *name; @property int idNumber; //定义其他方法 @end |
2.属性的实现
在实现文件中我们用@synthesize来实现用@synthesize来修饰相应的变量就起到类getter 和 setter 的方法实现的作用。用@synthesize也可以给函数改名用@synthesize name = otherName; 就可以给方法改名。
demo如下
1 2 3 4 | @implementation Student @synthesize name, idNumber; //其他方法的实现 @end |
3.定义后属性的使用
在使用getter和setter方法时有一点要注意以neme为例getter方法名为 name, 而setter的名为 setName;在使用getter和setter方法时和普通的函数用法一样
1 2 3 4 | //调用name的setter方法 [student setName : @ "ludashi" ]; //调用name的getter方法 NSString *name = [student name]; |
getter和setter方法也可以用点语法来实现
1 2 3 4 5 | //name的setter方法也可以这样写 student.name = @“ludashi” //name的getter方法也可以这样写 NSString *name = student.name; |
上面调用getter和setter方法的方式看着想是直接操作类的属性其实不然也是通过方法来操作的。
4.property有关的语法
1.自定义存取方法名
系统默认的存方法是setPropertyName, 默认的取方法是propertyName。可以用以下方式来更改setter和getter方法的名字
1用getter = getterName来指定getter自定义的名称
demo: @property (getter = getterName) NSString *name;
2用setter = setterName来指定setter自定义方法的名称
demo: @property (setter = setterName) NSString *name;
2. property的可读写性
property的可读写性决定属性是否有setter方法
1readwrite : 指定属性是可读写的这是默认值因此可以省略
@property (readwrite) NSString *name;
(2) readonly : 指明属性是只读的。系统不会setter方法但有getter方法
@property (readonly) NSString *name;
3.用于setter中的语义 决定了以何种方式对数据成员赋予新值
strong : 表示强引用关系即拥有对象的所有权。
weak : 表示弱引用不拥有对象的所有权当目标对象被销毁之后属性值会被自动设为nil;
assign(赋值): 直接赋值计数器不会加一简单的赋值方法默认赋值方式适合基本数据类型
copy(拷贝)把原来的对象拷贝过来计数器会加一比如原来对象的地址为0x01 ,拷贝过来的对象的地址为0x02;
retain(保留)这种方式传递的是指针原有的对象和被赋值的对象的地址是一样的
4.原子操作
atomic: 线程安全的
nonatomic: 线程不安全的
我们可以简写属性直接在接口文件中吧{}省略掉直接用@property来定义方法省去实现文件中的@synthesize, 访问属性时用_propertyName 给属性赋值时用self.propertyName
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。