// 1. weak与assign之间的区别
/* 我的看法:
* 使用:
* 1> weak在循环引用中能使一方释放引用,从而解决循环的问题,比如delegate,block内
* 2> 如果有一方已经强引用一个OC对象,则在另一方引用就不需要强引用,使用weak即可,避免重复引用,比如UI控件
* 不同:
* 1> weak其实和assign一样,都只是简单的生成seter、getter方法,而并不会对setter方法进行其他的操作,这是相同点。
同时,weak在一个运行循环结束后,销毁对象时,会自动将weak对象置nil。
* 2> weak只能用于OC,assign可以用做Foundation的基本数据类型。
*/
// 2. 怎么使用copy关键字
/** 我的看法:
* 使用:
* 1> 在属性是NSString(NSArray、NSDictionary)时,需要使用copy内存管理。
* 2> block也基本采用copy,虽然block使用assign创建或strong、weak也行,只是当ta一创建则被ARC放进了堆中(执行了copy
操作)
* 为何?
* 1> 如果使用strong,则会对NSString进行强引用,而不做其他操作,这会导致如果是NSMuttableString,则在本属性不知情的情
况下,更改了内存中的值,比如增删改。
* 2> 如果是weak,在没有其他强引用指向时,则创建即销毁。
* 3> 如果采用copy,则不会造成在属性不知情的情况下,更新其内存中的值,确保值的唯一性。
*/
// 3. 这个写法会出什么问题: @property (copy) NSMutableArray *array;
/** 我的看法:
* 1> 使用copy操作后,则将可变copy成一份不可变对象,那么就保证了值了唯一性,不会执行增删改的操作。
* 2> atomin具有同步锁的功能,但同步锁的效果不好,而且在setter方法中加了一些不必要的代码,造成了性能损失,因此一般采用
nonatomic,并且同步锁的的功能应该采用其他机制,比如@singnized,NSLock,信号量等
*/
// 4. 如何让自己的类具有copy修饰符?如何重写带copy的关键字setter?
// 这个太复杂,下一个,可自行google
// 5. @property的本质是什么,ivar、getter、setter是如何添加到类中的?
/** 我的看法:
* property = ivar + setter + getter
* ivar + setter + getter 是在编译过程中,编译器自动生成的,并且将ivar添加进了ivarlist中,setter、getter方法添加
进了methodlist中,property的描述添加进了propertylist方法中,并且添加了对象的偏移量,这个是硬编码,就是property在
内存中的位置,并以后通过这个偏移量来访问其值。
*/
// 6. @protocol和category中如何试用@property
/** 我的看法:
* 1> 在protocol中添加属性,则只会生成ivar以及setter、getter的声明,而在遵循此protocol中实现它们
* 2> 在category中添加属性,则只会生成ivar,而getter、setter方法需要用运行时objc_getAssio..以及objc_setAssio..
来实现。
*/
// 7. runtime如何实现weak?
/** 我的看法:(比较粗略)
* 将weak对象和指针放入一个weak表中,如果对象的强引用为0,则将此weak移出weak表,并将ta在运行循环结束时销毁
*/
// 8. @property有哪些修饰符?并且有哪些关键字?
/** 我的看法:
* 1> 原子性: (atomic默认, nonatomic)
* 2> 可读可写性: (readwrite默认, readonly)
* 3> 内存管理: assign、strong、weak、copy、unsafe_unretained
* 4> setter<name>、getter<name>的方法名更改
* 5> 修饰符有一些不常用的,比如nonnull、null_resettable、nullable
*/
// 9. weak属性需要dealloc时,置nil吗?
/** 我的看法:
* 不需要,在ARC中,无论是strong还是weak对象,iOS都会自动帮我们处理,属性被销毁时,weak也会被自动置nil
*/
// 10. @synthesize和@dynamic分别有什么作用?
/** 我的看法:
* 1> @synthesize就是告诉编译器,ivar的实例变量名字,默认是@synthesize var = _var;
* 2> @dynamic就是告诉编译器,setter、getter方法我自己写,不用你自己生成,如果没写,则编译器没问题,运行时因为你没写而
造成崩溃
*/
// 11. @property中NSString(NSArray、NSDictionary)中的copy有什么作用?如果改为strong会有什么后果?
/** 我的看法:
* 1> 因为NSString(NSArray、NSDictionary)有NSMuttableString(NSMuttableArray、NSMuttableDictionary),使用
copy为了防止,在自己不知道的情况下更改了属性值。
* 2> 如果采用strong,则因为父类指针可以指向子类对象,则在子类对象不知道的情况下,通过父类指针给改掉了属性。
* 3> 在集合类(NSArray、NSSet、NSDictionary)、非集合类对象里(NSString),使用copy、muttableCopy之后是:
非集合类采用copy后,都是指针拷贝
非集合类采用muttableCopy后,都是内容拷贝
集合类采用copy后,是指针拷贝
集合类采用muttableCopy后,都是内容拷贝(指的是对象是内容拷贝,集合内部的元素仍然是指针拷贝)
*/
回顾一下属性、copy、weak等
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 很多人讲属性修饰词的时候,喜欢从字面或者定义的角度介绍它们间的区别。这篇文章,我们侧重从修饰词对setter方法的...
- @property与@synthesize是成对出现的,可以自动生成某个类成员变量的存取方法。在Xcode4.5以...
- 1.NSString类型的属性为什么用copy ? NSString类型的属性可以用strong修饰,但会造成一些...
- @property([描述1] ,[描述2] ,[描述3])<Class *> <propertyName> 下面...
- assign,retain,strong,weak,还有copy,这些都是一个property在声明中可以...