【阅读资料】@interface @property 以及变量属性

方式一:直接在@interface中的大括号中声明。

@interface MyTest : NSObject{

    NSString *mystr;

}

方式三:直接用@property声明

@interface MyTest : NSObject{

}

@property (strong, nonatomic) NSString *mystr;

随后在.m文件中加入@synthesize mystr = _myStr; //可以不用加直接用  _变量名称


方式一声明的成员变量是只能在自己类内部使用的,不能在类的外部使用,(就是通过 类名. 点的方式是显示不出来的)

方式三则相反,它可以在类的外部访问,在类的内部可以通过下划线+变量名或者self.变量名的方式来访问。


==========================我是分割线============================


NSString *pt = [[NSString alloc] initWithString:@"abc"];
上面一段代码会执行以下两个动作
1 在堆上分配一段内存用来存储@"abc"  比如:内存地址为:0X1111 内容为 "abc"
2 在栈上分配一段内存用来存储pt  比如:地址为:0Xaaaa 内容自然为0X1111  


下面分别看下assign retain copy
assign的情况:NSString *newPt = [pt assing];  
此时newPt和pt完全相同地址都是0Xaaaa  内容为0X1111  即newPt只是pt的别名,对任何一个操作就等于对另一个操作。因此retainCount不需要增加。


retain的情况:NSString *newPt = [pt retain];  
此时newPt的地址不再为0Xaaaa,可能为0Xaabb 但是内容依然为0X1111。 因此newPt 和 pt 都可以管理"abc"所在的内存。因此 retainCount需要增加1  


copy的情况:NSString *newPt = [pt copy];
此时会在堆上重新开辟一段内存存放@"abc" 比如0X1122 内容为@"abc 同时会在栈上为newPt分配空间比如地址:0Xaacc 内容为0X1122 因此retainCount增加1供newPt来管理0X1122这段内存


@property是一个属性访问声明,扩号内支持以下几个属性:


atomic和nonatomic用来决定编译器生成的getter和setter是否为原子操作。

        atomic

                设置成员变量的@property属性时,默认为atomic,提供多线程安全。

                在多线程环境下,原子操作是必要的,否则有可能引起错误的结果。加了atomic,setter函数会变成下面这样:
                        {lock}
                                if (property != newValue) { 
                                        [property release]; 
                                        property = [newValue retain]; 
                                }
                        {unlock}

        nonatomic

        禁止多线程,变量保护,提高性能。

        atomic是Objc使用的一种线程保护技术,基本上来讲,是防止在写未完成的时候被另外一个线程读取,造成数据错误。而这种机制是耗费系统资源的,所以在iPhone这种小型设备上,如果没有使用多线程间的通讯编程,那么nonatomic是一个非常好的选择。

        指出访问器不是原子操作,而默认地,访问器是原子操作。这也就是说,在多线程环境下,解析的访问器提供一个对属性的安全访问,从获取器得到的返回值或者通过设置器设置的值可以一次完成,即便是别的线程也正在对其进行访问。如果你不指定 nonatomic ,在自己管理内存的环境中,解析的访问器保留并自动释放返回的值,如果指定了 nonatomic ,那么访问器只是简单地返回这个值。



(weak和strong)是retain,的2个分支,

(weak和strong)不同的是 当一个对象不再有strong类型的指针指向它的时候 它会被释放  ,即使还有weak型指针指向它。

一旦最后一个strong型指针离去 ,这个对象将被释放,所有剩余的weak型指针都将被清除。

可能有个例子形容是妥当的。

想象我们的对象是一条狗,狗想要跑掉(被释放)。

strong型指针就像是栓住的狗。只要你用牵绳挂住狗,狗就不会跑掉。如果有5个人牵着一条狗(5个strong型指针指向1个对象),除非5个牵绳都脱落 ,否着狗是不会跑掉的。

weak型指针就像是一个小孩指着狗喊到:“看!一只狗在那” 只要狗一直被栓着,小孩就能看到狗,(weak指针)会一直指向它。只要狗的牵绳脱落,狗就会跑掉,不管有多少小孩在看着它。

只要最后一个strong型指针不再指向对象,那么对象就会被释放,同时所有的weak型指针都将会被清除





什么时候用 assign ,当然是破房子,简装的房子拉
基础类型(简单类型,原子类型): NSInteger , CGPoint , CGFloat ,C数据类型( int , float , double , char 等)


什么时候用 copy
含有可深拷贝的mutable子类的类,如 NSArray NSSet NSDictionary NSData 的, NSCharacterSet NSIndexSet NSString
(可深度拷贝的房子)
但是NSMutableArray这样的不可以,Mutable的不能用copy,不然初始化会有问题。切记

什么时候用 retain
其他 NSObject 和其子类对象好嘛 (大多数)






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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值