OC编程

2019-12-10  本文已影响0人  litongde
OC语言基础.png

OC语言学习路线及重难点

关键字

// C语言中一共有32个关键字
auto double int struct break else long switch
case enum register typedef char extern return
union const float short unsigned continue for
signed void default goto sizeof volatile do if while static
// OC中新增的关键字
@interface @implementation @end
@public @protected @private @selector
@try @catch @throw @finally
@protocol @optional @required @class
@property @synthesize @dynamic
BOOL Class SEL YES NO id self 
super nil atomic nonatomic retain assign copy block ...

数据类型

对象存储细节

对象存储细节.png

isa指针

Xcode文档安装和自定义代码段

动态数据类型id

构造方法、类工厂方法

// 构造方法
- (instancetype)init {
    if (self = [super init]) {
        // Initialize self.
    }
    return self;
}
// 类工厂方法
+ (instancetype)类名称
{
    // 谁调用这个方法,self就代表谁
    // 注意:写类方法创建初始化对象,写self不要直接写类名
    return  [[self alloc] init];
}

类的启动过程(+load、+initialize)

+load方法

+initialize方法

内存管理 MRC

// set方法内存管理 例
- (void)setRoom:(Room *)room
{
    // 避免过度释放
    if (room != _room) {
        // 对当前正在使用的房间(旧房间)做一次release
        [_room release];
        // 对新房间做一次retain操作
        _room = [room retain];
    }
}
// dealloc方法的内存管理 例
- (void)dealloc
{
    [_room release];
    [super dealloc];
}

@property参数

  1. 控制set方法的内存管理
  1. 控制需不需要生成set方法
  1. 多线程管理
  1. 控制set方法和get方法的名称

ARC下@property参数

autorelease使用

@autoreleasepool
{   // 创建一个自动释放池
    Person *p = [[Person new] autorelease];
}   // 销毁自动释放池(会给池子中所有对象发送一条release消息)

自动引用计数ARC

ARC的判断原则

强指针

弱指针

Category 和 Extension

category分类 \ 类别 \ 类目 (一般叫分类)

类扩展(Class Extension) 是Category的一个特例

// 类扩展书写格式
// 对比分类, 就少了一个分类名称,因此也有人称它为”匿名分类”
@interface 类名 ()
@end

Block

Block是iOS中一种比较特殊的数据类型

// Block的定义格式
返回值类型 (^block变量名)(形参列表) = ^(形参列表) {
};

// 调用Block
block变量名(实参);

Block注意事项

Block是存储在堆中还是栈中

Protocol

// Protocol的定义
@protocol 协议名称
@required // 如果遵守协议的类不实现会报警告
@optional // 如果遵守协议的类不实现不会报警告
@end

// 类遵守协议
@interface 类名 : 父类 <协议名称1, 协议名称2,…>
@end

Foundation框架

Foundation框架提供了非常多好用的类, 比如

/**
 1、NSString 字符串
 NSString 比较
 -  (BOOL)isEqualToString:(NSString *)aString 比较的是内容
 - stingA == stringB 比较的是地址
 - NSURL URL的全称是Uniform Resource Locator(统一资源定位符)
 */
NSString *str = @"ltd"; // 常量区中的字符串只要内容一致, 不会重复创建

/**
 2、NSMutableString 可变字符串
 */
NSMutableString *strM = [NSMutableString string];

/**
 3、NSArray 数组
 */
NSArray *arr = @[@"Jack", @"Rose", @"Jim"];

/**
 4、NSMutableArray 可变数组
 */
NSMutableArray *arrM = [NSMutableArray array];

/**
 5、NSDictionary 字典
 */
NSDictionary *dict = @{@"name":@"lnj", @"phone":@"18682057731", @"address":@"天朝"};

/**
 6、NSMutableDictionary 可变字典
 */

/**
 Q:NSDictionary 和 NSArray 对比
 - NSArray是有序的,NSDictionary是无序的
 - NSArray是通过下标访问元素,NSDictionary是通过key访问元素
 */

/**
 7、NSNumber 
 NSNumber可以将基本数据类型包装成对象,这样就可以间接将基本数据类型存进NSArray\NSDictionary中
 */
NSNumber *num = @10;

/**
 8、NSValue
 NSNumber是NSValue的子类, 但NSNumber只能包装数字类型
 NSValue可以包装任意值, 可以用NSValue将结构体包装后,加入NSArray\NSDictionary中

 + (NSValue *)valueWithBytes:(const void *)value objCType:(const char *)type;
 + value参数 : 所包装数据的地址
 + type参数 : 用来描述这个数据类型的字符串, 用@encode指令来生成
 */

/**
 9、NSDate 时间
 */
// ————————————基本使用————————————
NSDate *now = [NSDate date];
// 设置转换后的目标日期时区
NSTimeZone *zone = [NSTimeZone systemTimeZone];
// 得到源日期与世界标准时间的偏移量
NSInteger interval = [zone secondsFromGMTForDate: date];
// 在当前时间基础上追加时区差值
now = [now dateByAddingTimeInterval:interval];

// ————————————格式化日期————————————
 // 创建时间
NSDate *now = [NSDate date];
// 创建时间格式化
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
// 指定格式
formatter.dateFormat = @"yyyy-MM-dd HH:mm:ss Z";
// 格式化时间
NSString *str = [formatter stringFromDate:now];

// ————————————日历对象————————————
 // 1.确定时间
NSString *time1 = @"2015-06-23 12:18:15";
NSString *time2 = @"2015-06-28 10:10:10";
// 2.将时间转换为date
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
formatter.dateFormat = @"yyyy-MM-dd HH:mm:ss";
NSDate *date1 = [formatter dateFromString:time1];
NSDate *date2 = [formatter dateFromString:time2];
// 3.创建日历
NSCalendar *calendar = [NSCalendar currentCalendar];
NSCalendarUnit type = NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay | NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond;
// 4.利用日历对象比较两个时间的差值
NSDateComponents *cmps = [calendar components:type fromDate:date1 toDate:date2 options:0];
// 5.输出结果
NSLog(@"两个时间相差%ld年%ld月%ld日%ld小时%ld分钟%ld秒", cmps.year, cmps.month, cmps.day, cmps.hour, cmps.minute, cmps.second);

/**
 10、NSFileManager 
 */
NSFileManager *manager = [NSFileManager defaultManager];

Foundation框架常见的结构体

Copy

特点

使用

前提

深复制和浅复制

@property中的copy的作用

注意:copy block 之后引发循环引用
如果对象中 block 又用到了对象自己,为了避免内存泄漏,应将对象修饰为__block

上一篇 下一篇

猜你喜欢

热点阅读