zoukankan      html  css  js  c++  java
  • 属性的属性attribute(二十三)

    在用@property声明属性时,在property和变量类型中间,加上括号(),括号里就要写attribute。

    attribute一共可以分为三大类:

    读写性控制:readonly、readwrite、setter、getter

    1、用readonly修饰的,只能读不能写,也就是只能生成getter方法,不能生成setter方法。

    2、用readwrite(默认),可以进行读写,也就是说,要生成getter和setter方法。

    3、用setter来修饰的,用来修改默认生成的setter方法名,修改成自己想要的方法名,方法名不能漏了冒号:。

    4、用getter来修饰的,用来修改默认生成的getter方法名,修改成自己想要的方法名。

    Teacher.h

    #import <Foundation/Foundation.h>

    @interface Teacher : NSObject

    //加上attribute

     

    //readonly 只读。不生成setter方法,只生成getter方法。

    //readwrite 可读可写,默认,生成getter,setter方法。

    @property(readonly) NSString *name;

    //getter 更改默认 getter 的方法名

    //setter 更改默认 setter 的方法名,注意setter方法名要加冒号:

    @property(getter=a,setter=b: )NSString *sex;

    @end

    Teacher.m

    #import "Teacher.h"

    @implementation Teacher

     

    @end

    原子性控制:nonatomic、atomic

    原子性控制,在多线程的情况下,才能体现其作用。

    nonatomic:是不加多线程保护,这种情况下,可以随意打断,然后另外一个人来做另外一件事。此时getter、setter内部不会做多线程访问处理,就是普通的getter、setter方法。

    atomic:(默认的)加多线程保护,此时就是,只能在做完一件事后,才能坐另外一件事,中间不能打断。getter、setter方法在内部做了多线程处理,是安全的。

    由于我们写的很多程序都是单线程的,很少写多线程的程序,我们就应该把atomic设置成nonatomic,因为atomic会消耗资源。

    Teacher.h

    #import <Foundation/Foundation.h>

    @interface Teacher : NSObject

    //加上attribute

    //nonatomic ,没有多线程保护,随时可能被打断

    //atomic ,多线程保护,一件事干完为止,中间不能被打断。(默认)(耗费资源)

    @property (atomic)NSString *money;

     

    @end

    语义设置:assign、retain、copy

    1、用assign标记的变量,不能同时声明getter、setter方法,只能写其中一个。只有加上@synthesize 属性变量名 = _ 属性变量名,这个声明时,才能同时写getter、setter方法。

    assign标记的有:标量(基本类型)、delegate(代理)。

    Person.h

    #import <Foundation/Foundation.h>

    @interface Person : NSObject

    //assign 1.用在标量(基本类型)2.用在delegate(代理)

    @property (nonatomic,assign)NSInteger age;

    @end

    Person.m (assign的内部实现)

    #import "Person.h"

     

    @implementation Person

    //加上@synthesize age = _age,才能同时写getter,setter方法

    @synthesize age = _age;

    //声明里用assign标记,不能同时写getter,setter方法。

    //assign

    - (void)setAge:(NSInteger)age{

        _age = age;

    }

    - (NSInteger)age{

        return _age;

    }

    @end

    2、retain

    retain标志的,除了标量,都可以去标识。

    Person.h

    #import <Foundation/Foundation.h>

    @interface Person : NSObject

    //retain 1.一般对象都用retain。(除了标量不能用retain,其他都能用)

    @property (nonatomic,retain)NSString *name;

    @end

    Person.m( retain的内部实现)

    #import "Person.h"

    @implementation Person

    @synthesize name = _name;

    //retain内部实现

    - (void)setName:(NSString *)name{

     

        if (_name != name) {

            [_name release];

            _name = [name retain];

        }

    }

     

    - (NSString *)name{

        return [[_name retain] autorelease];

    }

    @end

    3、用copy的标识的,必须要遵守<NSCopying>协议。

    Person.h

    #import <Foundation/Foundation.h>

    @interface Person : NSObject

    //1.遵循了NSCopying协议的;

    @property (nonatomic,copy)NSString *sex;

    @end

    Person.m(copy的内部实现)

    #import "Person.h"

    @implementation Person

    @synthesize sex = _sex;

    //copy内部实现

     

    - (void)setSex:(NSString *)sex{

        if (_sex != sex) {

            [_sex release];

            _sex = [sex copy];

        }

    }

     

    - (NSString *)sex{

        return [[_sex retain]autorelease];

    }

    @end

  • 相关阅读:
    sniffer嗅探
    记一次IE代理异常故障
    B860A机顶盒加强
    适合Lakka的安卓盒子配置
    MVG2000 破解
    网络图标显示地球的解决办法
    数码视讯Q7 TTL破解安装APP
    kbmmw 发布免费社区版
    一步一步实现kbmmw的httpsys使用https功能
    PostgreSQL 基本数据类型及常用SQL 函数操作
  • 原文地址:https://www.cnblogs.com/DevinSMR/p/5118631.html
Copyright © 2011-2022 走看看