回顾一下属性、copy、weak等

// 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、getter的方法名更改
 *  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等)