zoukankan      html  css  js  c++  java
  • iOS开发 入门学习总结(二)Objective-C 语法特性总结

    Objective-C Encapsulating Data

    01. atomic                   // default02. nonatomic
    03. strong=retain            // default04. weak= unsafe_unretained
    05. retain
    06. assign                   // default07. unsafe_unretained
    08. copy
    09. readonly
    10. readwrite                // default

    1.nonatomic

    在Objective-C 中定义的properties 默认是atomic,当然可以通过nonatomic 修饰取消其原子性,带来的好处就是acess nonatomic properties更快

    我发现绝大多数定义在.h文件中定义的property都需要设定成nonatomic。以后需要注意的是哪些property 是不能设置为nonatomic。

    注意:atomic 并不意味着线程安全。

    2. readonly,readwrite (默认)

    #.h文件中
    @property (readonly) NSUInteger answeredQuestions;  
    #.m 文件中定义
    @property (readwrite) NSUInteger answeredQuestions;
    这个技巧是为了隐藏信息。

    readonly 通知编译器,生成public getter方法,不提供public setter 方法,只对内提供setter 方法。

    3 const 变量

    .h文件定义在@interface 前面的const 修饰的变量

    extern NSString * const QuestionsListKey;
    extern NSString * const QuestionTextKey;
    extern NSString * const AnswerTextKey;
    extern NSString * const AnswerKey;

    .m 对在这些变量进行赋值

    NSString * const QuestionsListKey = @"QuestionList";
    NSString * const QuestionTextKey = @"QuestionText";
    NSString * const AnswerTextKey = @"AnswerText";
    NSString * const AnswerKey = @"Answer";

    这就类似C/C++ 中的宏。这些都是只读如果试图对其修改,编译器会报错。

    4 category。
    声明关于某个类的 category,那么所有该类的实例都具有这个category中添加的方法(当然前提是,import 该category)。
    category 可以用来添加类方法,或实例方法,但是不太适合用来添加property(用来添加property最好的实现是继承,如果需要添加property,那么我们需要新的类型来实现,此时更好的OO 实现是继承)。

    category 另一作用:可以运用于将复杂类的实现分解在多个源文件中。

    Best practise:为避免category 命名冲突,可以在方法前面添加三个字母的前缀。

    5.@class 与import 区别

    @class XYZ  仅仅告诉编译器 XYZ 这是个类,但是编译器完全不知其内部的构造。 即使不存在这个XYZ类,可以通过编译

    import “XYZ.h” XYZ 内部的任何的method 和property 对于编译器都是透明的。

    6.@synthesize 

    当我们需要直接 access 实例变量时,需要用下划线作为前缀。以用来区分这是实例变量而非局部变量。
    synthesize关键字的作用:
    @synthesize instanceVaraible = se_instanceVaraible , 那么此时实例变量就是se_instanceVaraible 而不是_instanceVaraible;
    @synthesize firstName,那么实例变量就变成 firstName;

    7.Objective-C 内存对象管理

    Objective-C内存管理大部分是基于automatic reference counting (ARC),应该避免出现环形强引用,因为这会导致内存泄漏。

    ARC 回收机制特点:精度低(无法处理环形引用),执行效率高。除Objective-C runtime 之外 COM模型也采用ARC管理构建。

    另外一种回收机制,采用有向图的方法从main 函数开始遍历heap中的对象,回收那些不可达的对象。其精度高,但是效率低。

    环形强引用

    环形强引用

    此时NSTableView 和Delegate 没有外部强引用指向这两者,这两者应该被回收,但是因为Objective-C 的内存管理是基于ARC,那么当出现环形强引用时,无法回收,造成内存泄漏。当然这也是ARC回收机制的弊端。

    可以通过使用weak 引用来避免环形强引用。(注意:Cocoa and Cocoa Touch中存在少数不支持weak 引用的类,比如NSTextViewNSFont and NSColorSpace等

    对于这些类,如果需要使用弱引用,unsafe_unretained 来修饰。但是它与weak 引用的区别在于,当unsafe_unretained指向的对象被回收后,其不被设为nil。

    源自apple developer library

    当Delegate 被Deallocated,指向Delegate的 weak 引用被自动设成nil。

    8.copy 关键字

    很好理解,在堆中维持对象的一个拷贝,任何对原来对象的改变都不会对copy对象产生影响。

    被设置成copy的对象,必须要支持NScopying protocol。

     

    //相关神贴:

    http://stackoverflow.com/questions/322597/class-vs-import?rq=1

    http://stackoverflow.com/questions/588866/atomic-vs-nonatomic-properties

  • 相关阅读:
    百度地图 如何制作泡泡放大镜?
    百度地图 孪生姐妹地图
    百度地图Api进阶教程-点聚合9.html
    百度地图Api进阶教程-实例高级操作8.html
    百度地图Api进阶教程-用户自定义数据(标记和搜索)7.html
    百度地图Api进阶教程-地图鼠标左右键操作实例和鼠标样式6.html
    百度地图Api进阶教程-弹出信息窗口5.html
    百度地图Api进阶教程-点击生成和拖动标注4.html
    app设计需注意的
    JS移动客户端--触屏滑动事件 banner图效果
  • 原文地址:https://www.cnblogs.com/yeek/p/3484648.html
Copyright © 2011-2022 走看看