`

《斯坦福大学公开课:iPhone开发教程2010年冬》笔记(看到第3集)

 
阅读更多

 

《斯坦福大学公开课: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,否则会有问题(当运行到事件退出池排干时,日志中报错)。



分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics