发表于: 2017-01-13 01:29:48

2 871


今天完成的事情:看完面向对象(下)看了十几页的Foundation框架详解,并把看的内容书上的例子都敲了一遍.

明天的计划:继续往下看五十页,然后复习.

遇到的问题:难点感觉还是在深拷贝,浅拷贝,深拷贝会把拷贝对象完全复制一份放到另一个内存里,及时改变拷贝对象,对原对象也没有影响,更安全.

浅拷贝,只是复制对象的指针,与被复制对象指向同一个指针,如果改变内容对原内容也会造成影响.

还有就是每天看的很多但是掌握的不牢固,这几天有点沉不住气,就抓自己的头发,咬咬牙,没有基础是没用的.

收获

NSInteger:大致等于long型整数;
NSUInteger:大致等于unsigned long型整数.
CGFloat:在64位平台上大致相当于double,在32位位平台大致相当于float.
这三个类型依然是基本类型.
NSValue和NSNumber都是包装类.NSValue是NSNumber的超类.
NSValue代表一个更通用的包装类,他可用于包装单个short,int,long,float,char,指针,对象id等数据项,通过包装类可以将它们放入NSArray等集合,(这些集合要求元素必须是对象).
NSNumber主要包装C语言的各种数值类型,包括三个方法:
1,+numberWithXxx:该类方法直接将特定类型的值包装成NSNumber;
2.- initWithXxx:该实例方法需要先创建一个NSNumber对象,在用一个基本类型的值来初始化NSNumber.
3.-xxxValue:该实例方法返回该NSNumber对象包装的基本类型的值.
(XXX代表int char等各种基本类型)
#import <Foundation/Foundation.h>


int main(int argc,const char* argv[])
{
   
NSNumber* num  = [NSNumber numberWithInt:20];
   
NSNumber* de = [NSNumber numberWithDouble:3.4];
   
NSLog (@"%d",[num intValue]);
   
NSLog (@"%g",[de doubleValue]);
   
NSNumber* ch = [[NSNumber alloc] initWithChar:'J'];
   
NSLog (@"%@", ch);
}


OC也有类似自动装箱的机制,直接把一个整型赋给NSNumber变量,但这种机制不完善,使自动装箱生成的NSNumber不支持ARC,而且不能把浮点数赋给NSUumber类型的变量.


1.非正式协议通过为NSObject创建类别来实现,而正式协议则直接使用@protocol创建.
2.遵守非正式协议通过继承特定类别的NSObject来实现,而遵守正式协议则有专门的Object-C语法;
3.遵守非正式协议不要求实现协议中定义的所有方法.而遵守正式协议则必须实现协议中定义的所有方法.
为了弥补遵守正式协议必须实现协议的所有方法造成的灵活性不足,OC2.0添加了@optional@required两个关键字:
@optional:位于该关键字之后@optional@end之前声明的方法是可选的,实现类既可选择实现这些方法,也可以不实现这些方法.
@required:位于该关键字之后.的方法是必须要实现的.



难点

OC提供三种编程方式与运行环境交互.
1.直接通过OC的源代码,这是最常见的方式,开发人员知识编写OC源代码,而运行环境负责在后台工作,当我们编译OC源代码时,编译器会创建大量数据结构和实现了动态机制的函数,其中数据结构负责保存类,类别中定义的数据,而函数则负责处理方法调用.
2.通过NSObject类中定义的方法进行动态编程,因为我们定义的绝大部分类都是NSObject子类,(除了NSProxy例外,)所有绝大多部分对象都继承NSObject的方法,故所有的对象都可以直接调用NSObject的方法来编程,在少数情况下,NSObject类只提供了方法模板,并没有为方法实现提供代码,例如NSObject实现了description方法,该方法返回对象的类名+地址组成的字符串,通过该字符串来描述对象,而NSObject的子类则可重写该方法返回更多的详细信息,除此之外NSObject还提供isKindOfClass:. isMemberOfClass方法,这两个方法可用于判断该类所属的类,respondsToSelector可用于判断该实例是否可调用指定方法,conformsToProtocol可用于判断该对象是否遵守指定协议,methodForSelector则用于返回指定方法实现的指针.
3.直接调用运行时函数进行动态编程,运行时系统是一个动态共享库,由系列位于/usr/include/objc目录的头文件中的函数和数据结构组成,这些工具都是C风格的,他们并不是OC编程必须的,但有些函数在OC 编程是也是有用的.



copy方法用于复制对象的副本,通常来说,copy方法总是返回对象的不可修改的副本,即使该对象本身是可修改的.例如,程序调用NSMutableString的copy方法,将会返回不可修改的字符串对象.
mutableCopy方法用于复制对象的可变副本,通常来说,mutableCopy 方法总是返回该对象可修改的副本,及时被复制的对象本身是不可修改的,调用mutableCopy方法复制出来的副本也是可修改的,例如,程序调用NSString的mutableCopy方法,将会返回一个NSMutableString对象.
无论如何,copy和mutableCopy返回的总是原对象的副本,当程序对复制的副本进行修改时,原对象通常不会受到影响.



返回列表 返回列表
评论

    分享到