• OC学习笔记之属性详解和易错点


    属性的概念在OC1.0中就存在,格式是定义实例变量,然后定义setter和getter方法,用点操作符操作属性

    举例,类的接口部分

     1 @interface Father : NSObject
     2 {
     3     NSInteger _item;
     4 }
     5 #pragma mark - 属性
     6 -(void)setItem:(NSInteger)item;
     7 -(NSInteger)item;
     8 
     9 -(void)setAAA:(NSInteger)aaa;
    10 -(NSInteger)AAA;
    11 
    12 @end

    类的实现部分

     1 #import "Father.h"
     2 
     3 @implementation Father
     4 
     5 -(void)setItem:(NSInteger)item{
     6     _item = item;
     7 }
     8 -(NSInteger)item{
     9     return _item;
    10 }
    11 
    12 -(void)setAAA:(NSInteger)aaa{
    13     _item = aaa;
    14 }
    15 -(NSInteger)AAA{
    16     return _item;
    17 }
    18 
    19 @end

    main函数

    1         Father *test = [[Father alloc]init];
    2         test.item = 19;
    3         NSLog(@"%ld",test.item);
    4         
    5         test.AAA = 20;
    6         NSLog(@"%ld",test.AAA);

    在上边的示例中定义了一个实例变量和两个属性,两个属性操作同一个实例变量,注意,属性和实例变量没有必然的联系,属性只是操作实例变量(甚至不操作实例变量,后面会详细解释),但是setter和getter方法的命名规则需要注意,setter方法的命名是set+属性名,getter的命名方法是属性名(属性AAA的setter方法是setAAA:,getter方法名是AAA)

    OC2.0以后提供了@property和@synthesize关键字从语法层简化了属性的书写

    属性的声明

     1 #import <Foundation/Foundation.h>
     2 
     3 @interface Father : NSObject
     4 {
     5     NSInteger _item;
     6     NSString *_str;
     7 }
     8 #pragma mark - 属性
     9 @property NSInteger item;
    10 @property NSString *AAA;
    11 
    12 @end
    View Code 

    属性的实现

    1 @implementation Father
    2 
    3 @synthesize item = _item,AAA = _str;
    4 
    5 @end
    View Code

    此时应注意,两个不同属性不能同时操作同一个实例变量,语法检查会报错

    Xcode5以后,属性实现部分的代码可以省略,Xcode会生成属性实现的代码(苹果官方推荐写法)

    在这里需要注意的点有点多,一一分析。

    在省略属性实现部分代码后,Xcode给出的默认的属性实现的代码是这样的

    @synthesize 属性1 = _属性1,属性2 = _属性2;

    也就是属性操作的实例变量时_+属性名,以上面属性声明代码为例,Xcode生成的代码是这样的

    @synthesize item = _item,AAA = _AAA;

    注意我们的类接口文件中只有_item,_AAA是没有的,这个变量是没有的,他是Xcode自动生成的真.私有实例变量,为什么加个真呢,因为这个变量不会生成在接口文件中,只会声明在类的实现文件中,而且是声明在类的最上端,大致是这样的

    1 @implementation Father
    2 
    3 NSString *_AAA;
    4 
    5 @synthesize item = _item,AAA = _AAA;
    6 
    7 @end
    View Code

    因此Father作为父类时_AAA是不会像@private下的实例变量一样被继承的,所以不推荐大家在子类中声明和父类中相同名称的属性,尤其是没有相对应的实例变量的时候,理由大家可以考虑下。

     最后简单介绍下属性的修饰词,一共有三类

    读写性修饰词:readwrite(默认) readonly

    原子性又叫线程安全修饰词:atomic(默认) nonatomic

    语义性修饰词:assign retain copy

    读写性修饰词就和字面意思一样可以控制属性的读写,默认是readwrite可读可写的当你设置成readonly时,此属性不可写,给属性写赋值语句的话编译会报错

    线程安全性就是控制线程是不是安全的(废话么。。。)

    在这开个传送门有兴趣的童鞋可以看下 http://www.cnblogs.com/zwq194/archive/2012/06/26/2563567.html

    语义性修饰词其实就是内存控制

    同样开个传送门 http://blog.csdn.net/hahahacff/article/details/39839571

  • 相关阅读:
    Java Web连接各种数据库方式汇总
    java.lang.UnsupportedClassVersionError: Bad version number in .class file 解决办法
    <meta 标签的详细使用
    Redis实战之征服 Redis + Jedis + Spring (一)
    Redis实战之征服 Redis + Jedis + Spring (二)
    Redis实战之征服 Redis + Jedis + Spring (三)
    快速组合数
    HDU4632:Palindrome subsequence(区间DP)
    阿里暂停微信服务:让商家回归微信的本职,做好客户服务
    谈谈无穷小微积分对我国微积分教学改革的影响
  • 原文地址:https://www.cnblogs.com/ieso-ios/p/5066523.html
Copyright © 2020-2023  润新知