OC之属性

来源:互联网 发布:淘宝客怎么引流 编辑:程序博客网 时间:2024/05/04 11:10
setter 方法作用:为单一的实例变量赋值.setter 方法规范写法:-号方法,无返回值,名字以set开头 + 要设置的变量的实例变量名(首字母大写):(setter 方法有且只有一个参数) + 参数的类型(和实例变量类型相同) + 参数名(和实例变量名相同).  (注意:如果以set开头,并且有多个参数,那么该方法为set方法,不是setter方法)getter 方法的作用:获取单一实例变量的值.getter 方法命名规范:-号方法,有返回值(返回值类型和实例变量类型相同) 方法名直接和实例变量名相同,无参数.属性是OC2.0之后出来的新语法,用来代替setter以及getter方法,使用属性可以快速创建setter以及getter方法的声明,setter以及getter方法的实现, 另外添加了对实例变量操作的安全处理.  提供了setter, getter的默认实现属性可以大大简化代码..h文件中 *  setter 方法作用:为单一的实例变量赋值.    setter 方法规范写法:-号方法,无返回值,名字以set开头 + 要设置的变量的实例变量名(首字母大写):(setter 方法有且只有一个参数) + 参数的类型(和实例变量类型相同) + 参数名(和实例变量名相同).  (注意:如果以set开头,并且有多个参数,那么该方法为set方法,不是setter方法)    getter 方法的作用:获取单一实例变量的值.    getter 方法命名规范:-号方法,有返回值(返回值类型和实例变量类型相同) 方法名直接和实例变量名相同,无参数. *///属性是OC2.0之后出来的新语法,用来代替setter以及getter方法,使用属性可以快速创建setter以及getter方法的声明,setter以及getter方法的实现, 另外添加了对实例变量操作的安全处理.//@property 用来定义属性, NSString * 属性的类型(和实例变量类型相同) name属性名(和实例变量名相同)//切记:@property只是自动声明setter以及getter 方法的声明.@property NSString *name;@property NSString *gender;@property NSInteger age;@property CGFloat height;@property CGFloat weight;.m文件中(可以不写,系统默认生成)/** *  @synthesize 属性的实现部分,实现属性自动生成setter以及getter方法.    name 属性名, 指定要实现哪一个属性生成的setter以及getter方法    _name, 指定setter和getter方法内部所要操作的实例变量. *///若果指定的实例变量没有定义,系统会自动生成指定的实例变量,但是生成的实例变量是私有的,子类不能直接访问.//如果实例变量想让子类访问,那在.h文件必须定义实例变量.//如果未指定setter和getter内部所要访问的实例变量时,系统自动生成一个和属性名一样的实例变量.//@synthesize name = _name, gender = _gender, age = _age, height = _height, weight = _weight;//如果对于setter和getter方法,如果我们实现了,系统就不会再自动生成.//如果在.m文件中为通过@synthesize对属性进行合成,系统会自动合成,只不过此时系统默认的setter和getter方法内部所操作的实例变量是_属性名.属性的属性第一类:读写特性(readonly, readwrite)第二类:原子性控制(nonatomic, atomic)//属性的特性(attribute)/** *  第一大特性:读写特性    (1)readonly:告诉编译器,属性在自动生成方法时,只会生成getter方法,不会生成setter方法.    (2)readwrite:告诉编译器,属性在自动生成方法时,既要生成setter方法,也要生成getter方法.系统默认的是读写特性.    (3)setter = aa:告诉编译器,当自动生成setter方法时,setter方法的方法名为指定的名字aa:,不采用默认的.    (4)getter = bb告诉编译器,当自动生成getter方法时,getter方法的方法名为指定的名字bb,不采用默认的.    第二大特性:原子性特性    (1)atomic:原子特性,保证线程安全,内部做了安全处理(加锁与解锁).    (2)nonatomic:非原子特性,不保证线程安全.因为对于setter以及getter方法的使用,比较频繁,在一段时间内可能要多次访问,所以使用atomic会非常消耗系统资源,降低程序的执行效率,使用nonatomic虽然不保证线程安全,但是使用一般情况下都是安全的.所以对于原子特性,使用nonatomic.         第三大特性:语义特性    (1)assign: 直接赋值,使用针对于基本数据类型.也可针对于对象类型(堆区的空间,即指针变量).系统默认的语义特性.    (2)copy: 针对对象类型,并且要服从NSCopy协议的对象才可以.回复制出一个新的对象,拥有新的对象的所有权.(引用计数+1).(先暂时这么理解)    (3): 针对于对象类型,会造成对象的引用计数+1. *///@property (readwrite) NSString *name;//@property (readwrite,setter = aa:) NSString *name;@property (nonatomic) NSString *name;@property (nonatomic) NSString *gender;@property (nonatomic) NSInteger age;@property (nonatomic) CGFloat height;@property (nonatomic) CGFloat weight;//如果将@synthesize省略,并且我们自己实现setter以及getter方法时,系统就不会生成对应setter以及getter,还有实例变量.//1.当把语义特性声明为assign时,setter以及getter方法时,内部实现.//- (void)setName:(NSString *)name//{//    _name = name;//}//- (NSString *)name//{//    return _name;//}//2.当把语义特性声明为retain时,setter以及getter方法时,内部实现.//- (void)setName:(NSString *)name//{//    if (_name != name) {//        [_name release];//        _name = [name retain];//    }//}//- (NSString *)name//{//    return [[_name retain] autorelease];//}////3.当把语义特性声明为copy时,setter以及getter方法时,内部实现.//- (void)setName:(NSString *)name//{//    if (_name != name) {//        [_name release];//        _name = [name copy];//    }//}//- (NSString *)name//{//    return [[_name retain] autorelease];//}Person *xiaoGuang = [[Person alloc] initWithName:@"xiaoGuang" gender:@"Man" age:23 height:180 weight:200];        //点语法,是一种快速访问setter以及getter方法的方式.声明属性默认生成对应的setter以及getter方法.所以属性和setter和getter方法都有关联.        //对象.属性名  ---如果在等号的左边,意味着调用setter方法,除次情况,都是调用getter方法.        xiaoGuang.name = @"xiaohuaidan";

0 0