在头文件中声明:
@property (nonatomic,strong) NSString * str;
在oc中,这一行代码表示一个名为str的属性。
在实现文件.m中声明:
@synthesize str;
在oc中类中声明了这一句话就会自动生成两个方法(生成属性的getter和setter),一个属性,如果实现了属性(在.m文件中)则会生成一个实例变量。
在类别中声明了了属性则会自动生成两个方法,则必须实现setter和getter,类别中属性要用@dynamic,但是不会生成实例变量。
在类拓展中声明了属性则必须再所属类的.m文件中实现,并且不会setter,getter,实例变量。
在协议中声明的属性必须在遵循接口的类的.m文件中实现,否则会提示警告,并且不会setter,getter,实例变量。
总结下:在类中声明了属性可以不写实现,系统可以自动实现,但是在类别,类扩展和协议中声明的属性则必须实现,否不会生效,因为系统不会自动生成getter,setter。同时类拓展可以为类添加私有变量和私有方法,类别只可以为类添加方法,不能添加其他任何东西。属性的最终目的在于两个:方法,实例变量。
(这是经验总结出来的O(∩_∩)O哈哈~)
1.assign,retain,copy的区别:
1 NSString * newstr=[str assign]; 2 NSString * newstr=[str retain]; 3 NSString * newstr=[str copy];
原str地址:0x1111 内容:0x2222,存储内容地址 0x2222,内容:@"abc"
变量符号 地址 内容 地址 内容
assign newstr 0x1111 0x2222 0x2222 @"abc"
retain newstr 0xaaaa 0x2222 0x2222 @"abc"
copy newstr 0xcccc 0x3333 0x3333 @"abc"
asssign 相于于指针赋值,不对引用计数进行操作,注意原对象不用了,一定要把这个设置为nil
retain 相当于对原对象的引用计数加1
copy 不对原对象的引用计数改变,生成一个新对象引用计数为1
这就是assign,retain,copy在内存角度上的区别。
2.原子性
atomicity,nonatomic(默认atomicity,单线程)
即是否为单线程操作。
可读,可写性:readwirte,readonly(默认是可读写)
3.strong 和weak (引自别人文章^_^)
iOS 5 中对属性的设置新增了strong 和weak关键字来修饰属性(iOS 5 之前不支持ARC)
strong 用来修饰强引用的属性;
@property (strong) SomeClass * aObject;
对应原来的
@property (retain) SomeClass * aObject; 和 @property (copy) SomeClass * aObject;
weak 用来修饰弱引用的属性;
@property (weak) SomeClass * aObject;
对应原来的
@property (assign) SomeClass * aObject;
就先写这么多,等继续研究后再补充。。
作为笔记:Objective-C属性property的一些认识,布布扣,bubuko.com