---------------------------------------------------------------------------------------- java
这本书,我已经看过两遍,那两遍都是在买mac pro以前看的,目的是...由于语法怪怪的颇有趣。
好吧,也许仍是有那么点歪心思的,如今买了电脑,第三遍看了,(⊙o⊙)…の,实践了才知道,中间会遇到这么多很纠结的问题。不过还好,速度比以前看要快不少不少了。。。 android
我是分割线
c++
终于所有实践了一次并写了一些小小的东西,不过仍是不太熟练。接下来会继续看另一本很基础的书,不过这本书就不会作笔记了,同时会跟着新买的一本口碑超赞的书进行实践练习,会有新笔记的。
这篇笔记估计不会有太多的更新了,但若是在后面的学习和回顾中发现笔记里有错误的理解和见解,会进行修改与调整的。
若是在看这篇笔记的你发现有什么问题,必定记得给我评论留言指出,O(∩_∩)O谢谢了!~ 程序员
---------------------------------------------------------------------------------------- web
理解不透的问题: objective-c
一、内存管理:虽然说能够自动管理内存,可是过来人说这个必需要懂,要很是懂。。。 express
二、类别和委托 小程序
三、NSCoding :对象的编码和解码 数组
四、并发 xcode
五、NSPredicate
----------------------------------------------------------------------------------------
单独拎出来的概念:
开闭原则(Open / Closed Principle)
----------------------------------------------------------------------------------------
解决方案:cmd+~,就是tab上面一个键,能够在项目中快速切换。
解决方案:这里走的是C的语法,每一个被调用的函数都须要在调用以前被声明。
进行到第三章最后一个实例时,cmd+r运行会报错:Must explicitly describe intended ownership of an object array parameter。若是你看到了这个错误信息,你能够选中左边的项目名,而后再选中右边的PROJECT-->Apple LLVM compiler 4.2 - Language-->Objective-C Automatic Reference Counting,它原本的值是Yes,将它的值改成No(不自动管理内存),就能够正常编译运行了(以下截图所示)。
错误的大概意思是,必须为方法中数组参数分配明确地空间。
方法调度:发送消息时,首先在当前类中查找该方法,若是没有,则向该方法的superclass中进行查找。
实例变量:从上往下查找?实例变量不存在从新声明的状况吧?(⊙o⊙)…不太明。。(脆弱的基类问题?不懂。。mark)
参考:http://blog.csdn.net/duxinfeng2010/article/details/8265273
@class 建立一个前向引用,并声明只会经过指针来引用该类。能够经过@class 让两个类互相引用。即,在A.h中用@class B,在B.h 中用@class A。但若是用 #import 让这两个类互相引用,就会出现编译错误。
实际上是我本身犯傻,照着书copy,将NSRange重定义了,天然会出错了。
最开始让我以为无语的是,objective-c在方法前面加上的+和-,不过如今以为挺好的,一目了然。
+:说明该方法是类方法,一般用于建立新的实例。例如,+ (id)stringWithFormat:(NSString *)format,...;
-:该方法为实例方法,咱们直接在类中定义的起必定做用的方法。
NSArray *array = @[@"marong",@"hello"]; NSEnumerator *enumerator = [array objectEnumerator]; id thingie = [enumerator nextObject]; while (thingie) { NSLog(@"I found %@", thingie); thingie = [enumerator nextObject]; }书中将
id thingie = [enumerator nextObject];
while表达式中,报错,我将该句移到循环体外面,并在循环体内加上迭代语句,而后正常。
#import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { @autoreleasepool { NSFileManager *manager; manager = [NSFileManager defaultManager]; NSString *home; home = [@"~" stringByExpandingTildeInPath]; NSDirectoryEnumerator *direnum; direnum = [manager enumeratorAtPath:home]; NSMutableArray *files; files = [NSMutableArray arrayWithCapacity:42]; NSString *filename; while (filename = [direnum nextObject]) { if ([[filename pathExtension] isEqualTo: @"jpg"]) { [files addObject:filename]; } } NSEnumerator *fileenum; fileenum = [files objectEnumerator]; while (filename = [fileenum nextObject]) { NSLog(@"%@",filename); } } return 0; }我发现我对所谓JS的各类特效愈来愈不耐烦,若是再没有一个统一的标准,日渐庞大而臃肿的JS队伍最终将溃不成军。一个写后台的同事问我,你为何不写程序啊,我以为你挺适合写程序的,你为何选择切页面这种工做呢?是的,把时间都花在无谓的特效与动画上,而遗忘了本身的本质,不论是在别人眼中仍是在你本身内心,永远都只是个切页面的。
无谓身边人如何唱衰IOS,不过我却以为有意思起来。没有太多奇葩兼容的苦恼,虽然也要兼容低版本系统,但是相比web和android的兼容问题,那都是毛毛雨。系统现成的特效,能够把更多地精力花在业务逻辑和性能优化上,毕竟总得走的更远一点,只作一个程序员仍是欠缺点什么。
快速枚举使用的语法:
for ( Type newVariable in expression ) { statements }
for ( existingItem in expression ) { statements }
枚举期间对象不能被改变。
使用快速枚举的三个类:
NSArray, NSDictionary, NSSet
快速枚举的特性:能够将已有的NSEnumerator 对象或其子类传递给它。
NSFileManager *manager; manager = [NSFileManager defaultManager]; NSString *home; home = [@"~" stringByExpandingTildeInPath]; NSMutableArray *files; files = [NSMutableArray arrayWithCapacity:50]; // [manager enumeratorAtPath:home] 的返回值类型为 NSDirectoryEnumerator for (NSString *filename in [manager enumeratorAtPath:home]) { if ([[filename pathExtension] isEqualTo: @"jpg"]){ [files addObject:filename]; } } for (NSString * filename in files) { NSLog(@"%@", filename); }
如今貌似用不到书上也就是后面截图那些了,自动生成的main函数中都会有下面这段代码:
@autoreleasepool { // do something here }
int main(int argc, const char * argv[]) { NSFileManager *manager; manager = [NSFileManager defaultManager]; NSString *home; home = [@"~" stringByExpandingTildeInPath]; NSLog(@"%@", home); NSString *path; path = [NSString stringWithFormat:@"%@/Documents/studyfile/资料网站搜集.txt", home]; NSString *filestring; filestring = [[NSString alloc] initWithContentsOfFile: path]; NSLog(@"%@", filestring); return 0; }
不知道有没有哪里写错了, ,等学的深一点了再回头来检查好了。反正log里面木有问题就是,哈哈。
#import <Foundation/Foundation.h> @interface Tire : NSObject { float pressure; float treadDepth; } - (id) initWithPressure: (float) pressure treadDepth: (float) treadDepth; - (id) initWithPressure: (float) pressure; - (id) initWithTreadDepth: (float) treadDepth; @end @implementation Tire // 注意 - (id) init { if (self = [self initWithPressure:34 treadDepth:20]){ } return self; } - (id) initWithPressure:(float) p treadDepth:(float) t { if (self = [super init]){ pressure = p; treadDepth = t; } return (self); } - (id) initWithPressure:(float) p { if (self = [self initWithPressure:p treadDepth:20]){ } return (self); } - (id) initWithTreadDepth: (float) t { if (self = [self initWithPressure:34 treadDepth:t]){ } return (self); } - (NSString *) description { NSString *desc; desc = [NSString stringWithFormat:@"Tire : Pressure : %.1f , TreadDepth : %.1f", pressure, treadDepth]; return (desc); } @end @interface TireSub : Tire { float sub1; float sub2; } @end @implementation TireSub // 注意子类的 init 方法 - (id) init { if (self = [super initWithPressure:34 treadDepth:20]){ sub1 = 59; sub2 = 69; } return (self); } - (NSString *) description { NSString *desc; desc = [NSString stringWithFormat:@"Tire : Pressure : %.1f , TreadDepth : %.1f, Sub1 : %.1f, Sub2 : %.1f", pressure, treadDepth,sub1,sub2]; return (desc); } @end int main(int argc, const char * argv[]) { @autoreleasepool { TireSub *tiresub = [[TireSub alloc] init]; NSLog(@"%@", tiresub); } return 0; }
#import <Foundation/Foundation.h> @interface MRProperty : NSObject { NSString *name ; float address; } @property NSString *name; @property float num; @property(copy) NSString *string; // for object type @property(retain) NSMutableArray *array; // for object type @property NSString *secondName; @property(readonly) NSString *lover; - (id) initWithName: (NSString *) name address: (float) num; @end @implementation MRProperty // ! Incomplete implementation @synthesize name; @synthesize num; @synthesize string; @synthesize array; @synthesize secondName = second; @synthesize lover; - (id) init { if ([self = self initWithName: @"ma" num: 40.0]) { } return (self); } - (id) initWithName: (NSString *) n num: (float) a { if (self = [super init]) { name = [n copy]; num = a; second = @"rong"; lover = @"zsl"; } return (self); } @end int main(int argc, const char * argv[]) { @autoreleasepool { MRProperty *property = [[MRProperty alloc] initWithName:@"ma" num:40]; property.string = @"Hi, my love!~"; NSLog(@"name is %@ ; num is %.1f ; string is %@.", property.name, property.num, property.string); NSLog(@"my second name is : %@", property.secondName); NSLog(@"my lover is : %@", property.lover); } return 0; }
感受须要多用才能更明白一点。。。
我把它理解为 java里面的接口,在定义类时声明须要实现哪些接口。(⊙o⊙)…不知道对伐。哎呦,为啥我以为java里面的接口更好理解呢?
protocol的声明示例以下:
@protocol Panel <NSObject> // 必须实现 - (id) create; // 可选 @optional - (void) drawCicle; - (void) drawDoted; - (void) drawRect; // 必须实现 @required - (void) clearPanel; @end
protocol的使用示例以下:
#import <Foundation/Foundation.h> #import "Panel.h" @interface Engine : NSObject <NSCopying,NSCoding> @end
protocol的使用示例以下:
// 跟在id以后,要求对象遵照指定的协议 - (void) setObjectValue: (id<NSCopying>) obj; // 用协议修饰方法的参数 - (void) draft: (Person<BaseballPlayer> *person);
int (^square_block)(int number) = ^(int number) {return (number * number);};
int result = square_block(5);
NSLog(@"%d",result);
typedef double (^MKSampleMultiplyBlockRef)(double a, double b);
MKSampleMultiplyBlockRef multiply = ^(double a,double b){ return a * b;};
MKSampleMultiplyBlockRef add = ^(double a,double b){ return a + b;};
double a = 20, b = 40;
__block double c = 3;
MKSampleMultiplyBlockRef multiply2 = ^(double a, double b) {c = a * b;};
// 若是不声明 __block ,则编译时会出错。
// 没有长度的可变数组 和 没有长度的结构体 没法被声明为 __block 类型
NSLog(@"%f",multiply(a,b));
NSLog(@"%f",add(a,b));
block能够定义不少函数块,惟一的限制是这些函数块能拥有的参数只能是定义时的形参,不过它可使用的变量的范围却很广。
全局变量、全局函数、封闭范围内的参数、函数级别的__block变量、封闭范围内的非静态变量会被获取为常量、objective-c的实例变量、代码块内部的本地变量
// 又是须要深究的一章
属性列表类,包括:NSArray、NSDirectory、NSString、NSNumber、NSDate、NSData
NSDate *date = [NSDate date]; NSLog(@"today is %@", date); NSDate *yesterday = [NSDate dateWithTimeIntervalSinceNow: -(24 * 60 * 60)]; NSLog(@"yesterday is %@", yesterday); const char *string = "hi, there, this is a c string!"; NSData *data = [NSData dataWithBytes:string length: strlen(string) + 1]; NSLog(@"data is %@", data); NSLog(@"%d byte string is '%s'", [data length], [data bytes]); NSArray *phrase; phrase = [NSArray arrayWithObjects:@"l", @"seem", @"to",@"be", @"very", @"sad" , nil]; [phrase writeToFile:@"/Users/marong/Documents/test.txt" atomically:YES]; // atomically 是否先写入缓冲区,(写入成功后再替换原文件,可避免写入失败损坏源文件,但须双倍磁盘空间) NSArray *phrase2; phrase2 = [NSArray arrayWithContentsOfFile:@"/Users/marong/Documents/test.txt"]; NSLog(@"%@", phrase2); // 2013-07-08 12:28:09.181 File[936:303] today is 2013-07-08 04:28:09 +0000 // 2013-07-08 12:28:09.181 File[936:303] yesterday is 2013-07-07 04:28:09 +0000 // 2013-07-08 12:28:09.182 File[936:303] data is <68692c20 74686572 652c2074 68697320 69732061 20632073 7472696e 672100> // 2013-07-08 12:28:09.182 File[936:303] 31 byte string is 'hi, there, this is a c string!' // 2013-07-08 12:28:09.183 File[936:303] ( l, seem, to, be, very, sad )
// 表示又不太明白,脑子有点糊里糊涂的感受了
-setNilValueForKey:
-valueForUndefinedKey:
-setValue:forUndefinedKey;
Car *car; car = [[Car alloc] initWithName:@"car1" modelYear:1988 numberOfDoors:1 mileage:1980.0]; NSLog(@"%@", car); NSLog(@"%@", [car valueForKey:@"name"]); // valueForKey : 查找 -key 或 -isKey 命名的get方法,入不存在,则查找 对象内部名为 _key 或key 的实例变量。 // c或c++中没法进行该操做 [car setValue:@"Harold" forKey:@"name"]; [car setValue: [NSNumber numberWithInt: 1988] forKey:@"modelYear"]; NSLog(@"%@", car); [car setValue: [NSNumber numberWithFloat: 29.98] forKeyPath:@"engine.horsepower"]; NSLog(@"%@", [car valueForKeyPath:@"engine.horsepower"]); NSLog(@"%@", [car valueForKeyPath:@"tires"]); // 若是路径中含有一个数组属性,则该键路径的其他部分将被发送给数组的每一个对象 NSNumber *num = [car valueForKeyPath:@"tires.@count"]; NSLog(@"car has %d tires", num); // @count, @blah, @interface,@avg,@sum,@min,@max,@distinctUnionOfObjects (改变全部属性) //Car-Value-Coding[2680:303] car1 , a 1988 1 1980.0 has 4 tires. //Car-Value-Coding[2680:303] car1 //Car-Value-Coding[2680:303] Harold , a 1988 1 1980.0 has 4 tires. //Car-Value-Coding[2680:303] 29.98 //Car-Value-Coding[2680:303] ( // tires0, // tires1, // tires2, // tires3 //) //Car-Value-Coding[2680:303] car has 1223 tires
NSArray *array = [NSArray arrayWithObjects:@"marong1", @"marong2", @"marong3", nil]; NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF IN {'Herbie', 'marong1', 'marong2'}"]; NSArray *result; result = [array filteredArrayUsingPredicate:predicate]; NSLog(@"%@", result); //NSPredicate[3008:303] ( // marong1, // marong2 //)
// 确保不一样线程会连续访问临界区的代码 (mark,关于并发性即多线程问题,不太明)
当object为nil时,静态分析器将会发出警告。
@synchronize(mutex,atomic) // 系统自动生成,保证getter和setter方法互斥
1》id类型:在Objective-C 中,id 类型是一个独特的数据类型。在概念上,相似Java 的Object 类,能够转换为任何数据类型。换句话说,id 类型的变量能够存听任何数据类型的对象。在内部处理上,这种类型被定义为指向对象的指针,其实是一个指向这种对象的实例变量的指针。(参考:http://blog.csdn.net/lonelyroamer/article/details/7711895)
2》在类的interface中,没有参数的方法后面不加冒号;
3》[super 方法名: 参数]; // 在override superclass中的某个方法时,须要在方法最后面加上这句调用superclass中的该方法。
4》self = [super init] // 相关解释以下所示:
5》继承&复合:inheritance & composition:is & has
6》accessors :存取器