您的位置:首页 > 其它

3 属性与实例变量

2016-02-01 16:41 239 查看

类型成员



数据成员

*注意,可以用属性访问的情况下,尽量不要直接访问实例变量,否则引用可能会有内存管理问题出现。

初始化和析构器以及自定义访问器方法中才直接访问实例变量。因为这引用类型有内存管理附加方法,但是这三个方法的生存周期比较特殊,因此不会出现问题。

// @property 类型 [类类型需要'*'号,值类型不需要] 属性名称;
@property NSString * name;
@property int age;

// 可以自定义访问器方法
@property (getter=giveName, setter=setName) NSString * name;

/* OC中并不支持类属性。
但是可以可以通过C语言方法模拟一个类属性。 */
static int _max = 100;
+(int)max {
return _max
}
+(void)setMax:(int)newValue {
_max = newValue
}

// 可以直接定义实例对象,但是就只有类内可以访问了。
@implementation CustomClass {
int _age;
}

@end




实例变量

实例变量一般都是私有的,但是可以通过
@public
让他公有化,但是,很少见。

@interface Shape : NSObject  {
@public int _data;
}

// 访问时,以类似C语言的风格进行
shape->_data = 10




生存周期









atomic:

atomic属性可以确保在多线程情况下,不会同时有多个线程对属性进行操作。

weak:

ARC机制之下。通过自动引用计数来决定对象是否可以被释放。

如果两个对象之间相互引用,在该对象从栈上释放之后,由于在堆中任然有指针指向他们,所以他们的自动引用计数会一直大于0,因此无法被释放。

因此需要对这种情况下的对象使用(weak)描述特性,使用了weak之后,该指针不会增加自动引用计数,因此可以阻止循环引用。

copy:

正常情况下,对象之间的赋值其实是对指针的拷贝,因此赋值之后,赋值对象与被赋值对象其实是指向同一个堆的位置,当其中之一进行数据操作之后,其他对象也会被影响。

而加了copy之后,再进行赋值的时候,会对赋值对象进行深拷贝并传递拷贝出来的新内容给被赋值对象。这种情况下,会在堆中新
4000
建新的内容,因此不会相互影响。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  实例 数据