声明属性的的使用场景了解了,简单的说就是替代set get。 语法合适是 @property(特性1,特性2……)变量类型 变量名; 这边本人不了解的就是这个括号里的“特性” set方法的这几种特性有什么不同吗,用法是怎么的呢?或说什么情况下使用? 还有 一个括号里是不是只能有两个特性 。 求指导惑
解决方案
5
可以有多个属性,那里面的除了readonly一般对set和get没什么影响,get那个一般是为了给bool值赋值改变名字用的
5
帮你写好set get方法
5
不必太纠结,需要什么直接写,然后在方法里可以直接用self.
20
1. set方法的几种特性
这里我们需要分两个阶段来说明,ARC(自动引用计数)和MRC(手动引用计数),ARC是iOS5才出现的。
MRC模式:
assgin 用于值类型,就只是基本的赋值,例如基本数据类型:int,float,double,NSInteger等;还有就是防止产生循环引用的对象,例如delegate,不过这里需要程序员特别当心,当delegate被释放后,需要手动置为nil,否则再使用delegate回调就会崩溃
retain 用于对象,也就相当于指针对象。它对传入的对象进行引用计数加1的操作,只要计数不为0,就不释放,可以安全使用
这个相比C++是一个巨大的进步,C++中很多crash都是指针的使用不当造成的,原因是C++里指针对象的创建、引用、释放操作,都是程序员手动实现,稍不留意就会用到一个野指针什么的,幸好后面有了智能指针的概念,其实它就是引用计数的思想。
copy 也是用于对象,不过它的目的是”赋值对象”和”被复制对象”不要相互影响;retain的话只是计数+1,其实是指向同一个对象,所以他们会相互影响的,在这个地方修改了它的值,其他使用它的地方就能看到修改后的值的效果。copy有深拷贝和浅拷贝,这个本人具体看下实例,理解更方便
ARC模式:
strong 跟retain的意思相同并产生相同的代码,但是语意上更好更能体现对象的关系.
weak 跟assgin的意思相同。好处就是:当该对象引用计数为0时,即该对象被释放后,用weak声明的实例变量指向nil,即实例变量的值为0,不会出现僵尸对象,即使向它发送消息,程序也不会崩溃,原因是iOS中向nil对象发送消息不会crash。delegate 和 Outlet 一般用weak来声明
copy 同上,跟MRC模式含义一样
2. 一个括号里是不是只能有两个特性?
括号里的特性可以一个,两个或多个。包括原子性,存取器控制,内存管理。
@property(nonatomic) int number; 其实还有两个默认值,存取控制器:readwrite, 内存管理:assgin
@property (nonatomic, setter = mySetter:,getter = myGetter ) NSString *name; 重定义setter,getter
这里我们需要分两个阶段来说明,ARC(自动引用计数)和MRC(手动引用计数),ARC是iOS5才出现的。
MRC模式:
assgin 用于值类型,就只是基本的赋值,例如基本数据类型:int,float,double,NSInteger等;还有就是防止产生循环引用的对象,例如delegate,不过这里需要程序员特别当心,当delegate被释放后,需要手动置为nil,否则再使用delegate回调就会崩溃
retain 用于对象,也就相当于指针对象。它对传入的对象进行引用计数加1的操作,只要计数不为0,就不释放,可以安全使用
这个相比C++是一个巨大的进步,C++中很多crash都是指针的使用不当造成的,原因是C++里指针对象的创建、引用、释放操作,都是程序员手动实现,稍不留意就会用到一个野指针什么的,幸好后面有了智能指针的概念,其实它就是引用计数的思想。
copy 也是用于对象,不过它的目的是”赋值对象”和”被复制对象”不要相互影响;retain的话只是计数+1,其实是指向同一个对象,所以他们会相互影响的,在这个地方修改了它的值,其他使用它的地方就能看到修改后的值的效果。copy有深拷贝和浅拷贝,这个本人具体看下实例,理解更方便
ARC模式:
strong 跟retain的意思相同并产生相同的代码,但是语意上更好更能体现对象的关系.
weak 跟assgin的意思相同。好处就是:当该对象引用计数为0时,即该对象被释放后,用weak声明的实例变量指向nil,即实例变量的值为0,不会出现僵尸对象,即使向它发送消息,程序也不会崩溃,原因是iOS中向nil对象发送消息不会crash。delegate 和 Outlet 一般用weak来声明
copy 同上,跟MRC模式含义一样
2. 一个括号里是不是只能有两个特性?
括号里的特性可以一个,两个或多个。包括原子性,存取器控制,内存管理。
@property(nonatomic) int number; 其实还有两个默认值,存取控制器:readwrite, 内存管理:assgin
@property (nonatomic, setter = mySetter:,getter = myGetter ) NSString *name; 重定义setter,getter
5
@property(特性1,特性2……),nonatomic 一般是固定,后面的strong,copy之类的是根据你要定义的属性的类型而定。例如你要定义一个NSString类型,特性就是copy。整数、字符、数组、view之类的都要有之对应的特性。