《斯坦福大学公开课:iPhone开发教程2010年冬》笔记
链接:
http://v.163.com/special/opencourse/iphonekaifa.html
一、斯坦福大学公开课:iPhone开发教程2010年冬> 基础入门
http://v.163.com/movie/2010/6/C/7/M6RU83DCT_M6RU957C7.html
1. 课程的链接:http://www.stanford.edu/class/cs193p/cgi-bin/drupal/
2. (25:28)证书的超时时间是这样用的:防止课程过后再使用该证书,但可以在课程期间卖出去赚钱。
3.(27:18)iPhone OS核心架构(最上层是Cocoa Touch)
4.(41:10)Interface Builder自动生成控制器代码
二、斯坦福大学公开课:iPhone开发教程2010年冬> 2.各种基础的类,功能,对象和实例的介绍
http://v.163.com/movie/2010/6/N/D/M6RU83DCT_M6RU962ND.html
1. (11:23)OOP三术语。
2. (19:12)新增类型:匿名对象(匿名函数?id?),类(class),选择器(SEL)。
3. (20:10)没有分配在栈的对象(只分配在堆上)。
4. (45:49)self在类方法中指向类对象。
5. (46:41)选择器相当于C++函数被编译后带类型参数信息的方法名(不同的是ObjC不关心参数类型而关心参数名)。
6. -isEqual:
7. (52:20)-description:(用于%@格式化)
8. (54:00)变长参数是例外,后面可以带逗号,不带名称。
9. (59:13)常量NSString字符串不需要释放。
10. (59:44)NSString *log = [NSString stringWithFormat:@"It's %@", aString];
11. NSString -isEqualToString:,-hasPrefix:, -intValue,-doubleValue
12. NSMutableString +string, -appendString:, -appendFormat:
13. (1:06:59)所有集合类(数组,字典,集合)都有两个版本(immutable和mutable)
14. NSArray +arrayWithObjects:(必须以nil结束,不能直接放入原始类型的值,除非封装成NSNumber),-count,-objectAtIndex:,-indexOfObject:(找不到时返回NSNotFound而非nil)
15. NSMutableArray +array, -addObject:, -removeObject:, -removeAllObjects, -insertObject:atIndex:
16. NSDictionary +dictionaryWithObjectsAndKeys:, -count,-objectForKey:(找不到时返回nil)
17. NSMutableDictionary(子类)+dictionary, -setObject, -removeObjectFor:, removeAllObjects
18. NSSet +setViewObjects:(必须以nil结束), -count, -containsObject:
19. NSMutalbeSet +set, -addObject:, -removeObject:, -removeAllObject, -intersectSet:, -minusSet:,
20. 用for(in)遍历可以避免不小心修改集合对象。
21. NSNumber +numberWithInt:, +numberWithDouble:, -intVaule, -doubleValue
22. 工厂方法生成的对象会自动释放,如NSString的+stringWithFormat
三、斯坦福大学公开课:iPhone开发教程2010年冬> 3.如何创建你自己的定制类
http://v.163.com/movie/2010/6/3/I/M6RU83DCT_M6RU96B3I.html
1. 移除build目录
2. #import避免多次包含,所以不要用#include
3. 用self和super表示调用自身的方法实现和超类方法实现
4. (16:49)实现自己的init:
-(id)init{
if (self = [super init]) { //确保self非空(可能是内存分配错误导致nil)才初始化
age = 0;
name = @"Bob";
}
return self;
}
init只是改变内容而非分配内存。
5. (22:04)alloc和dealloc(相当于C的malloc和free)dealloc像free那样不可以反复调用,但它从不显式、直接地调用(除非在引用计数减到0时)。一般用-retain(引用数加一)和-release(引用数减一)。+alloc(引用数设置为1)
6. (26:50)实现自己的dealloc:
-(void)dealloc {
//...
[super dealloc];
}
7. 对象所有权
* retain情况下的setter,需要考虑引用计数问题。
-(void)setName:(NSString)newName {
if(name != newName) { //需要判断,否则调用dealloc后无法再retain了
[name release];
name = [newName retain]; //最初拥有者不是我
//...
}
}
* copy情况下的setter
-(void)setName:(NSString)newName {
if(name != newName) {
[name release];
name = [newName copy]; //最初拥有者是我
}
}
8. 释放ivar
-(void)dealloc {
[name release]; //不管用copy还是非copy,引用计数都要减一。
[super dealloc];
}
9. (38:09)返回创建的对象
(NSString *)fullName {
NSString *result;
result = [[NSString alloc] initWithFormat:@"%@ %@", firstName, lastName];
[result autorelease]
return result;
}
* 凡是带aloc,copy或new的方法返回的对象都需要调用release。
* 其它方法则返回autorelease对象。
10. UIkit会在每次事件循环都自动排干Autorelease池。
但Foundation需要手动drain。
可以通过retain来让autorelease的对象维持久些(?)
autorelease不是垃圾回收。
11. 属性(Objective-C 2.0新增,新API广泛采用,如UIKit)
//.h
@property int age; //可读写
@property (copy) NSString *name; //只用于对象属性:assign(指针赋值),retain(保持),copy(赋值)
@property (readonly) BOOL canLegallyVote;
//.m
@synthesize age;
@synthesize name;
-(BOOL)canLegallyVote {
return (age > 17);
}
//转换为实例变量
@synthesize age = numberOfYearOld; //numberOfYearOld是实例变量,age是属性
//混合synthesize和implement
@synthesize age;
//显式实现setter,而getter仍然可以被synthesize。
-(void)setAge:(int)value {
age = value;
// do something;
}
//点语法
//如果在setter内使用点语法可能会出现死循环
-(void)doSomething {
name = @"Fred"; //直接访问ivar
self.name = @"Fred"; //访问setter
}
10. (59:05)[NSNull null]可以放入数组中,但nil不可以放入数组
11.(1:05:07)autorelease的对象([NSMutalbeString stringWithString:@"Hello"])的retain/release要平衡,不要多余地release,否则会有问题(当运行到事件退出池排干时,日志中报错)。