3 属性与实例变量

类型成员

这里写图片描述

数据成员

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

// @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之后,再进行赋值的时候,会对赋值对象进行深拷贝并传递拷贝出来的新内容给被赋值对象。这种情况下,会在堆中新建新的内容,因此不会相互影响。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值