类型成员
数据成员
*注意,可以用属性访问的情况下,尽量不要直接访问实例变量,否则引用可能会有内存管理问题出现。
初始化和析构器以及自定义访问器方法中才直接访问实例变量。因为这引用类型有内存管理附加方法,但是这三个方法的生存周期比较特殊,因此不会出现问题。
// @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之后,再进行赋值的时候,会对赋值对象进行深拷贝并传递拷贝出来的新内容给被赋值对象。这种情况下,会在堆中新建新的内容,因此不会相互影响。