首页 > 代码库 > 作为笔记:Objective-C属性property的一些认识

作为笔记:Objective-C属性property的一些认识

在头文件中声明:

@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;

 

就先写这么多,等继续研究后再补充。。