- 如果用weak修饰,那么当viewController释放后,A对象的delegate会自动置为nil
- 如果用assign修饰,当viewController释放后,A对象的delegate会变成野指针,要防止这种情况,就要重写viewController的dealloc方法,手动将A对象的delegate置为nil.
- (void)dealloc{
self.A.delegate = nil;
};
复制代码
ARC与MRC下有什么不同?就是MRC下只能用assign修饰,而在ARC下既能用weak也能用assign,只是用assign要做多一定工作,在苹果官方文档中,都是用的week修饰词
UITableViewDelegate,UITableViewDataSource
@property (nonatomic, weak, nullable) id <UITableViewDataSource> dataSource;
@property (nonatomic, weak, nullable) id <UITableViewDelegate> delegate;
复制代码
属性 是可以说是面向对象语言中封装的一个体现,在自定义类中设置 ‘属性’ 就相当于定义了一个私有变量、设置器(setter方法)以及访问器(getter方法),其中无论是变量的定义,方法的声明和实现都是系统自动生成的并且经过了相应地内存管理和优化,无需开发者操心。 属性的声明: 属性一般定义在类的接口,或类的延展内,并且放在方法的声明之前,成员变量的声明之后。属性关键字是@property,括号内的是属性的属性,然后是变量的类型和名字,属性的定义一般分为两种情况,一种是非对象类型的变量,如int整型,使用assign,第二种是对象类型的变量(NSobject),使用retain或copy(delegate除外) @property和@synthesize帮我们轻易的生成对象的getter和setter方法来完成对对象的赋值和访问。但是如果我们如果要动态设置对象的getter和setter方法可以使用@property和@dynamic组合。对象访问方法property的属性设置非常多。
###1.atomic 和 nonatomic atomic是默认的属性,表示对对象的操作属于原子操作,主要提供多线程访问的安全。在多线程的下对对象的访问都需要先上锁访问后再解锁,保证不会同时有几个操作针对同一个对象。使用atomic比nonatomic更耗费系统资源,访问性能低。 nonatomic 表示访问器的访问不是原子操作,不支持多线程访问安全,但是访问性能高。
2.readwrite 和readonly
readwrite 是默认的属性,表示可以对对象进行读和写,会生成对象相应的setter和getter方法。 **readonly **表示只允许读取对象的值,只会生成对象的getter方法。
3. assign retain和copy
retain 表示对NSObject和及其子类对象release旧值,再retain新值,使对象的应用计数增加一。 此属性只能使用于obejective-c类型对象,而不能用于Core Foundation对象。(retain会增加对象的引用计数,而基本数据类型或者Core Foundation对象都没有引用计数,把对象添加到数组中时,引用计数将增加1)。
-(void) setOldValue: (NSString*) newValue {
if (newValue !=oldValue) {
[oldValue release];
oldValue = [newValue retain];
}
}
复制代码
**assign ** 是默认属性,只可以对基本数据类型(如CGFloat,NSInteger,Bool,int,代理对象)等使用。该方式会对对象直接赋值而不会进行retain操作。 **copy ** 表示重新建立一个新的计数为1的对象,然后释放掉旧的值。 都知道retain是对指针的拷贝,copy是对内容的拷贝。 比如:NSString 对象的地址为0x100,其内容为“string”,如果使用copy到另外一个NSString对象,则会生成另外一个地址为0x110的对象,只不过内容仍然是‘string“。如果使用retain到另外一个NSString对象,则该对象的地址仍然为0x100,只不过该对象的计数变为2.
NSString、NSArray、NSDictionary 经常使用 copy 关键字,是因为他们有对应的可变类型:NSMutableString、NSMutableArray、NSMutableDictionary.
为确保对象中的属性值不会无意间变动,应该在设置新属性值时拷贝一份,保护其封装性block,也经常使用 copy,关键字block。
使用 copy 是从 MRC 遗留下来的“传统”,在 MRC 中,方法内部的 block 是在栈区的,使用 copy 可以把它放到堆区.
在 ARC 中写不写都行:对于 block 使用 copy 还是 strong 效果是一样的,但是建议写上 copy.!!!
复制代码
@property(copy)NSMutableArray *array;(这样写的问题)
复制代码
因为 copy 策略拷贝出来的是一个不可变对象,然而却把它当成可变对象使用,很容易造成程序奔溃这里还有一个问题. 该属性使用了同步锁,会在创建时生成一些额外的代码用于帮助编写多线程程序,这会带来性能问题. 通过声明 nonatomic 可以节省这些虽然很小,但是不必要额外开销,在 iOS 开发中应该使用 nonatomic 替代 atomic.
4.strong 和 weak
在ARC的模式下,对象声明时需要加入strong和weak,方便内存的自动管理。默认情况下是strong类型。 strong 强引用,默认的属性,类似于retain,其实是一个相对的概念,就是一个引用。如果有一个强引用持有该对象,则该对象就不能被释放。默认的所有实例变量和局部变量都是strong指针。 weak 弱引用,类似于assign,弱引用除了不决定对象的存亡外,其他与强引用相同。 即使一个对象被持有无数个弱引用,只要没有强引用指向他,那麽其还是会被清除,它不是对象的拥有者。其值会在对象被释放后自动设置为nil。
delegate 代理属性,代理属性也可使用
assign自身已经对它进行一次强引用,没有必要再强引用一次,此时也会使用 weak
自定义IBOutlet 控件属性一般也使用weak;也可以使用 strong,但是建议使用 weak
复制代码
weak指针主要用于“父-子”关系,父亲拥有一个儿子的strong指针,因此父亲是儿子的所有者;但为了阻止所有权循环,儿子需要使用weak指针指向父亲。典型例子是delegate模式,你的ViewController通过strong指针(self.view)拥有一个UITableView, UITableView的dataSource和delegate都是weak指针,指向你的ViewController ###weak 和 assign 的不同点
weak 在属性所指的对象遭到摧毁时,系统会将 weak 修饰的属性对象的指针指向 nil,在 OC 给 nil 发消息是不会有什么问题的;
assign 在属性所指的对象遭到摧毁时,属性对象指针还指向原来的对象,由于对象已经被销毁,这时候就产生了野指针.
!!!如果这时候在给此对象发送消息,很容造成程序奔溃assigin 可以用于修饰非 OC 对象,而 weak 必须用于 OC 对象。
复制代码
###@synthesize 和 @dynamic 分别有什么作用
- @property 有两个对应的词,一个是@synthesize,一个是@dynamic。 如果@synthesize 和@dynamic 都没写,那么默认的就是
@syntheszie var = _var;
复制代码
- @synthesize 的语义是如果你没有手动实现 setter 方法和 getter 方法,那么编译器会自动为你加上这两个方法。
- @dynamic 告诉编译器:属性的 setter 与 getter 方法由用户自己实现,不自动生成。(当然对于 readonly 的属性只需提供 getter 即可) 假如一个属性被声明为
- @dynamic var;然后你没有提供@setter 方法和@getter 方法,编译的时候没问题,但是当程序运行到 instance.var = someVar,由于缺 setter方法会导致程序崩溃; 或者当运行到 someVar = instance.var 时,由于缺 getter 方法同样会导致崩溃.
iOS关于属性关键字-转载的 END