Objective-C 声明属性

创建: 2018/01/24

完成: 2018/01/25

 

遗留: TODO

 

声明属性(declared property)

 属性的声明与功能
 属性的声明

 @property 读写

 @property(readonly) 只可读

 ● 多个用逗号连接

 ● 也可以自己声明

 属性的实现

用@property声明的变量可以用@synthesize

 ● 多个用逗号连接

 ● 如果不带@synthesize, 内部属性名字变成_名字

 

@interface Sample : NSObject 
@property int sample;
@end

@implementation Sample
//内部为名为int _sample;
@end

    也可以在内部改名,  类内部用其他名称来使用

@synthesize value = runningAverage; //类内其他方法处该属性名字变为等号右边,外部不变

 ● 可读生成getter, 可读写生成getter, setter 

 ● 必须已经声明了@property

 ● 如果不需要接入类方法(getter, setter), 可以用@dynamic

   也可以不要

 

 @dynamic

 相关的getter, setter由自己实现

 不实现也不报错,但是调用时程序会崩溃

 属性的option

 指定多个用,隔开

 

种类 opt  说明
 指定方法名

 getter=信息选择器

 setter=信息选择器

 改变系统默认的getter,setter名字
 读写属性  readonly  只读
 readwrite

 读写(默认)

 值的设定方法

 assign

 unsafe_unretained(ARC用)

 代入(默认)

 retain

 strong(ARC用)

 强参照, strong

 weak(ARC用)  弱参照
 copy  复制
 nonatomic

 atomic

 nonatomic

 默认不指定,相当于atomic, 保护改属性不会被多线程同时操作

 不同@sythesize,自己来实现的话声明里最好加上nonatomic

     
     
     
     
     
     

 

 值设定方法的选项   

# TODO: Supply [property属性的值设定方法选项的详细 p169]

# TODO: Supply [多线程 p480]

 属性的继承

 ● 可以重载getter, setter

 ● 除了readonly可以变成readwrite以外,@property必须一样

 ● 子类不能用@sythesize来实现父类的声明属性

 ● 类型, 协议内部可以有声明属性但不能有@sythesize, 在实现部(@implementation)处自己实现

# TODO: Supply [类型, 协议内部可以有声明属性但不能有@sythesize]

 不能和方法族重合

 用ARC时方法不能属于方法族

 alloc方法族

 copy方法族

 mutableCopy方法族

 new方法族

 init方法族

   
  点运算符获取属性
 相当于发出信息 结论: 尽量不要用点运算符获取属性 
sample.var; // 获取 相当于 [sample val]
sample.val = n; // 设定 相当于 [sample setVal: n]
sample.method; // 不带参数的方法呼出方法, 不要这么用

 

点运算符读取

sample.var;

 

读取

[sample val];

 

点运算符设定

sample.val = n;

 

设定

[sample setVal: n];

 

注意: 

 ● 不能用在id类上

 ● 不能用在只有setter的上面

 

 

 ● 可以连续使用

n = obj.productionList.length;

 ● 可以连续代入

n = obj.count = obj.depth = ++n;

 ● 递减递减,复合代入运算符的解释

n = obj.length++;
//相当于
n = [obj setLength: [obj length] + 1];

n *= obj.length;
//相当于
n = [obj setLength: [obj length] * n];

 ● 类内部呼出声明属性方法

self.count = 12;

super.depth = maxDepth;

 ● 和构造体的点运算符混用

属性是构造体的时候

struct Sample a = ...; //构造体
obj.b = a;


obj.b.length = 5; 
//相当于
[obj b].length = 5;

 

 

 获取属性的方针

 ● 构造函数里面直接获取属性

 ● 内部函数的话,最好都用声明属性的方法,也可以直接获取。最好固定一种

   
   
   
   
   
   
   
posted @ 2018-01-24 06:56  懒虫哥哥  阅读(174)  评论(0编辑  收藏  举报