属性和setter以及getter

来源:互联网 发布:energy star软件 编辑:程序博客网 时间:2024/04/30 06:13


 setter方法的作用:

 为单一的实例变量赋值

 setter方法规范写法:{-号方法,无返回值(void),名字以set开头 + 要设置的变量的实例变量名(首字母大写):(setter方法有且只有一个参数) + 参数的类型(和实例变量的类型相同) +参数名(和实例变量名相同(去掉了下划线))}

 (set方法可以设置多个变量,setsetter不是一码事)


 getter方法的作用:

获取单一实例变量的值,

getter方法的命名规范:{-号方法,有返回值(返回值类型和实例变量类型相同)方法名直接和实例变量名相同(去掉了_),无参数.}


//属性:oc2.0之后出来的语法,用来替代setter以及getter方法,使用属性可以快速创建setter以及getter方法的声明,setter以及getter方法的实现.另外添加了对实例变量操作的安全处理

//@property用来定义属性,NSString *属性的类型(和实例变量的类型相同) name属性名(和实例变量名(去掉_)相同)



 属性的特性:

属性格式:@property(第一大特性,第二大特性,第三大特性) NSString *name;

 第一大特性:读写特性

 (1)readonly:告诉编译器,属性在自动生成方法时,只会生成getter方法,不会生成setter方法.

例如:@property(readonly) NSString *name;

 (2)readwrite:高数编译器,属性在自动生成方法时,既要生成setter方法,也要生成getter方法,系统默认的读写特性

 (3)setter = aa:告诉编译器,当自动生成setter方法时,,setter方法的方法名为指定的名字aa,不采用默认的特性

 (4)getter  = bb;告诉编译器,当自动生成getter方法时,getter方法的方法名为指定的名字bb,不采用默认的特性

 @property(readwrite:setter:aa) NSString *name;


 第二大特性:原子性特性

 (1)atomic:原子特性,保证线程安全,内部做了安全处理(加锁与解锁),系统默认的原子特性

 (2)nonatomic:非原子性,不保证线程的安全.

 因为对于setter以及getter方法的使用,比较频繁,在一段时间内可能要多次访问,所以使用atomic会非常消耗系统的资源,降低程序的执行效率,使用nonatomic虽然不保证现成的安全,但是在使用时一般情况下都是安全的,所以对于原子特性,使用nonatomic


 第三大特性:语义特性

 (1)assign:直接赋值,使用针对于基本数据类型,也可针对于对象类型(语义特性默认为assign)

 (2)copy:针对于对象类型,并且要服从NSCoping协议的对象才可以,会复制出一个新的对象,拥有新的对象的所有权(引用计数 + 1),(先暂时这么理解)

 (3)retain:针对于对象类型,会造成对象的引用计数+1.

 

@synthesize 属性的实现部分:

实现属性自动生成的setter以及getter方法

 name属性名,指定要实现哪一个属性生成的setter以及getter方法

@synthesize name = _name;

如果在.m文件中未通过@synthesize对属性进行合成,系统会自动合成,只不过是系统默认的settergetter方法内部所操作的实例变量是(_属性名)

若果指定的实例变量没有定义,系统会自动生成指定的实例变量,但是生成的实例变量是私有的,子类不能直接访问

 如果实例变量想让子类访问,那么.h文件必须定义实例变量

如果对于settergetter方法,如果我们实现了,系统就不会在自动生成了


点语法,是一种快速访问setter以及getter方法的方式,声明为默认生成对应的settergetter方法,所以属性和settergetter方法都有关联

 (对象.属性名)----如果在等号左边,意味着调用setter方法,除此情况外都是使用getter方法

例如:shuaishuai.name = @"xiaohuaidan";//和下面等价

  [shuaishuai setName:@"xioahuaidan"]


如果将@synthesize省略,并且我们自己实现setter以及getter方法时,系统就不会生成对应的setter以及getter方法,还有对应的实例变量

当把语义特性声明为assign,setter以及getter方法内部实现

当把语义特性声明为retain,setter以及getter方法内部实现

当把语义特性声明为copy,setter以及getter方法内部实现

-(void)setName:(NSString *)name

{

    if (_name != name) {

        [_name release];

        _name = [name retain];

    }

}

-(NSString *)name

{

    return [[_name retain] autorelease];

}


//@synthesize name = _name , sex = _sex,age = _age,height = _height,weight = _weight;




0 0
原创粉丝点击