zoukankan      html  css  js  c++  java
  • OC self = [super init] , 点语法 , @property

    OC self = [super init] , 点语法 , @property

    构造方法为啥这么写?

    self = [super init];

    [super init] 的结果可能有三种:
    第一种: [super init] 初始化成功,这个是最最正常的情况。
    第二种: [super init] 初始化失败,我们都知道oc的两步创建,alloc开辟内存空间,init初始化对象,但是init还有另外一个作用,在初始化失败的时候,init方法会返回一个nil。回头行文的最上面,如果self为nil,那么if(self)语句的内容,将不被执行,已确保程序健壮安全。
    第三种:self = [super init]执行之后,内存指向了不相关的地址。这种情况的出现,一般是一下几种情况:单例、类簇、对象为NSNumber类型、父类在初始化的时候释放了当前对象,然后重新开辟了新的内存地址。
    一般情况下都要用以上语句来防止父类改变对象的内存地址导致self指针指向无效内存。

    深入构造方法:

    在子类自定义构造方法中调用父类自定义构造方法,降低代码的耦合性。

    举例:

    - (instancetype)initWithName:(NSString *)name age:(int)age no:(int)no
    {
        self = [super initWithName:name age:age];
        if (self) {
            _no = no;
        }
        return self;
    }
    

    点语法:

    1. 在OC中点语法不是访问成员变量,而是隐式调用get / set方法 :  
      person.age = 10等效于[person setAge:10];  
      int  age = person.age 等效于 [person age];
    2. 通过在get / set方法中打印数据(或设置断点的方式 ), 可以观察到方法的调用 。
    3. set/get方法里不要调用点语法,会造成死循环

    合成存取器:

    @property的格式:
    @property (修饰列表) 变量类型 变量名;

    Xcode4.4之前:
    @property使编译器自定生成set/get方法声明。
    @synthesize自动生成set/get方法的实现
    @synthesize还会自动生成私有成员变量

    Xcode4.4以后:不用再写@synthesize,编译器通过@property就能给我们生成set/get方法的声明和实现,默认生成成员变量:_propertyName
    用@property生成的成员变量是私有的。

    当我们想改变默认的成员变量名时,@synthesize age = newName;

    如果子类想访问父类的成员变量,

    1. 通过set/get方法
    2. 显示的声明成员变量
    OC提供@property的修饰词有():
    • atomic(默认):atomic意为操作是原子的,意味着只有一个线程访问实例变量。atomic是线程安全的,至少在当前的存取器上是安全的。它是一个默认的特性,但是很少使用,因为比较影响效率,这跟ARM平台和内部锁机制有关。

    • nonatomic:nonatomic跟atomic刚好相反。表示非原子的,可以被多个线程访问。它的效率比atomic快。但不能保证在多线程环境下的安全性,在单线程和明确只有一个线程访问的情况下广泛使用。

    • readwrite(默认):readwrite是默认值,表示该属性同时拥有setter和getter。

    • readonly: readonly表示只有getter没有setter。

    • assign :简单赋值,不更改索引计数,假设你用malloc分配了一块内存,并且把它的地址赋值给了指针a,后来你希望指针b也共享这块内存,于是你又把a赋值给(assign)了b。此时a和b指向同一块内存,请问当a不再需要这块内存,能否直接释放它?答案是否定的,因为a并不知道b是否还在使用这块内存,如果a释放了,那么b在使用这块内存的时候会引起程序crash掉.对基础数据类型 (例如NSInteger,CGFloat)和C数据类型(int, float, double, char, 等)适用.

    • retain:(MRC)与strong相对应,使用了引用计数,retain+1,release -1;当引用 计数为0时,dealloc会被调用,内存被释放

    • copy:用于非共享内存时,每个指针有自己的内存空间

    • strong:(ARC中默认属性),等于非ARC中的retain,与retain相对应,

    • weak:与assign 相对应,用于IBOutlets,如,UIViewController的子类,即一般的控件。

    strong与weak的区别举例(摘自他人博客):
    前提:
    我们把要用strong或者weak的对象比作一只风筝,风筝想挣脱线的束缚,自由飞翔去,如果此时有一根线,那么这只风筝就挣脱不了
    过程分析
    strong属性的变量:
    当我们把指向一只风筝的变量声明为strong时,此时,你就拥有控制这只风筝的线,假如此时有五个人同时控制这只风筝(即这只风筝对象有三个strong类型的变量指向它),那么只有一种情况,这只风筝才会挣脱掉线的束缚:这三个人都放掉手中的线,(release掉).
    weak属性的变量:
    当我们把指向一只风筝的变量声明为weak时,此时,就像站在旁边看风筝的观众们一样,当上面的三个人还握着手中的线时,他们只能看到风筝,并不能控制它,他们能做的只能是用手指指向风筝,并大喊,“看,那只风筝飞得真高!”,然而,当上面的三个人把手中的线都放掉时,此时,风筝飞走了,看不见了,不管有再多的观众,他们再也看不到风筝了,这个故事告诉我们一个道理:当strong类型的指针被释放掉之后,所有的指向同一个对象的weak指针都会被清零。

  • 相关阅读:
    GC(垃圾分代收集)
    排序算法总结
    Redis中的数据结构
    事务的隔离性(续篇)
    手写Spring mvc框架 (二)
    MySql日志与事务的隔离级别
    手写Spring mvc框架 (一)
    IO流
    随笔三(Ajax)
    关于博主noble_
  • 原文地址:https://www.cnblogs.com/xubaoaichiyu/p/5478754.html
Copyright © 2011-2022 走看看