美文网首页
Objective-C开发笔记01

Objective-C开发笔记01

作者: Bondi_blue | 来源:发表于2019-11-09 13:08 被阅读0次

    Objective-C的类型

    引用类型

        类 class
    
        指针 pointer
    
        块 block
    

    值类型

        基础数值类型int float double char 
    
        结构 struct
    
        枚举 enum
    

    类型装饰

        协议 protocol
    
        类别 category
    
        扩展 extension
    

    类 class 和 结构 struct

    类:

    引用类型(位于栈上面的指针(引用)和位于堆上的实体对象)

    结构:

    值类型(实例直接位于栈中)

    栈(stack) VS 堆(heap)

    栈(stack):存储值类型
    • 无ARC负担,由系统自动管理,以执行函数为单位。

    • 空间大小是编译时确定(参数+局部变量)。

    • 函数执行时,系统会自动分配,结束时立即回收。

    • 函数之间通过拷贝值传递。

    • 具有局部性,大小有限额,超出会栈溢出(stack overflow)一般情况下不会,除非死循环和超大递归。

    堆(heap):存储引用类型对象
    • 分配由程序员手动请求(创建对象时)

    • 释放由运行时ARC机制自动释放(确定时)

    • 函数之间通过拷贝引用(指针)传递

    • 具有全局性,总体大小无限制(受制于系统内存整体大小)

    • 堆是最自由也是最容易出问题的,比如内存泄漏。

    其他:

    传参:传参其实就是栈与栈之间的拷贝

    要注意运行时内存图--”胸中有沟壑”

    1:接口与实现

    • @interface...@end //接口(头文件)
    • @implementation...@end //实现文件
    • @class //向前引用
      注:类别通过增加新的类和实例方法来扩展现有类的行为。作为惯例,类别被定义在它们自己的.{h,m}文件里,

    2:实例变量可视性

    • @public
    • @package
    • @protected
    • @private

    @public:实例变量可使用符号 person->age = 32" 被直接读取。

    @package:实例变量是公开的,除非它被指定在框架外(仅适用64位架构)

    @protected:实例变量仅可由其类和其衍生类访问

    @private:实例变量仅可由其类访问

    3:属性

    • @property
    • @synthesize
    • @dynamic

    关于属性值得注意的一点是,从 Xcode 4.4 开始,我们再也不需要明确的合成属性了。在 @interface中被声明的属性在 implementation 中被自动的合成(与前面有下划线的ivar名称一起,比如@synthesize propertyName = _propertyName )。

    @dynamic 是相对于 @synthesize 的,它们用样用于修饰 @property,用于生成对应的的 getter 和 setter 方法。但是 @ dynamic 表示这个成员变量的 getter 和 setter 方法并不是直接由编译器生成,而是手工生成或者运行时生成。

    4:协议

    • @protocol
    • @required
    • @optional

    定义了一组将在服从该协议的类中实现的方法,就好像它们被加入到那个类的接口中一样。

    你可以通过指定方法为必须和可选来更深入的定制一个协议。可选的方法在接口上存根,以便能被 Xcode 自动完成但如果方法没有被实现又不生成警告。协议方法默认是必须的

    5:异常处理

    • @try
    • @catch
    • @finally
    • @throw

    Objective-C 主要通过 NSError 来沟通意想不到的异常状态。而其他语言使用异常处理,Objective-C 则将异常以及程序员错误降级为真正的异常的行为。

    6:对象常量

    • @""
    • @42, @3.14, @YES, @‘Z‘
    • @[]
    • @{}
    • @()

    @"":返回一个由引号内Unicode内容初始化的 NSString 对象。

    @42@3.14@YES@‘Z‘:返回一个由相关类构造初始化的 NSNumber 对象,比如 @42[NSNumber numberWithInteger:42],或者 @YES[NSNumber numberWithBool:YES]。支持使用后缀进一步指定类型,如 @42U[NSNumber numberWithUnsignedInt:42U]

    @[]:返回一个由冒号分隔的对象列表作为内容的 NSArray 对象。比如,@[@"A", @NO, @2.718][NSArray arrayWithObjects:@"A", @NO, @2.718, nil] (注意在数组常量中结束标记nil是不需要的)。

    @{}:返回一个由特定键-值对初始化作为内容的NSDictionary对象,格式:@{@"someKey" : @"theValue"}

    @():动态评估封装的表达,并返回基于其值的合适的对象常量(比如,const char*返回NSStringint返回NSNumber,等等。)。这也是使用数字常量和枚举值的指定方式。

    7:Objective-C 常量

    • @selector()
    • @protocol()

    @selector():返回一个指向有特定名称的选择器的 SEL 指针。用于类似 -performSelector:withObject: 的方法。

    @protocol():返回一个指向有特定名称的协议的 Protocol * 指针。用于类似 -conformsToProtocol: 的方法。

    8:C 常量

    • @encode()
    • @defs()

    @encode():返回一个类型的类型编码。这个类型值可以用于 NSCoder -encodeValueOfObjCType:at 中的第一个参数编码。

    @defs():返回一个 Objective-C 类的布局。比如,定义一个与 NSObject 有相同布局的 struct,你只需要这样:

    9:优化

    • @autoreleasepool{}
    • @synchronized{}

    @autoreleasepool{}:如果你的代码中包含创建大量临时对象的紧密的循环,你可以通过 @autorelease 更加积极的释放这些寿命短暂,局部范围内的对象来达到优化。@autoreleasepool 替换并且改进了旧的又慢又不能在ARC中使用的NSAutoreleasePool

    @synchronized(){}:这个指令为在一特定的环境中(通常是 self )确保安全执行某一特定块提供了一个便捷的方法。这种情况的死锁很昂贵,所以,对于针对特定级别的线程安全的类来说,建议使用专用的 NSLock 属性或者使用如OSAtomicCompareAndSwap32(3) 的底层的死锁函数。

    10:兼容

    • @compatibility_alias

    允许现有类有不同的名称作为别名。

    11:id类型

    在Objective-C中,id是一般对象类型,id数据类型可以存储任何类型的对象。
    例如在下面的代码中,将Number声明为id类型的变量

    id number;
    

    我们可以声明一个方法,使其具有id类型的返回值。
    例如下面的代码中,声明了一个名为newOb的实例方法,它具有名为type的单个整形参数,返回值类型为id类型

    -(id) newOb: (int)type;
    

    相关文章

      网友评论

          本文标题:Objective-C开发笔记01

          本文链接:https://www.haomeiwen.com/subject/omtnbctx.html