(4/18)重学Standford_iOS7开发_框架和带属性字符串_课程笔记
第四课(干货课):
(最近要复习考试,有点略跟不上节奏,这节课的内容还是比较重要的,仔细理解掌握对今后的编程会有很大影响)
本节课主要涉及到Foundation和UIKit框架,基本都是概念与API知识,作者主要做一归纳整理。
0、其他
a.对象初始化
①通过alloc init(例如[[NSString alloc] initWithFormat:@"%d",2])
②通过类方法(例如[NSString StringWithFormat:@"%d",2])
③通过其他实例对象的方法(例如stringByAppendingString:)
b.nil
可以给nil发送消息,但只会得到nil
对于返回为struct类型的方法会返回未定义的类型
c.动态绑定
对象在执行期间(runtime)才会判断所引用对象的实际类型.
id(实质上为所有对象指针的类型如NSString *),这里讨论动态绑定主要为了明确哪些情况会出现编译警告与运行崩溃,方便后面讨论统一概念。
课程中的原例子:
@interface Vehicle
- (void)move;
@end
@interface Ship : Vehicle
- (void)shoot;
@end
情况①:属于正常使用情况,不会出现编译警告与崩溃。
Ship *s = [[Ship alloc] init]; [s shoot]; [s move];
情况②:父类调用子类特有方法,编译时会有警告,运行时正常运行。
Vehicle *v = s; [v shoot];
情况③:任意id类型调用子类方法,无编译警告(因为类型为id),运行时若obj不为ship类,则会崩溃。若调用不存在的方法,则会出现编译警告(尽管类型为obj)
id obj = ...; [obj shoot]; [obj someMethodNameThatNoObjectAnywhereRespondsTo];
请况④:其他类型调用子类方法,会出现编译警告,若进行类型转换则没有编译警告,但仍会崩溃。
NSString *hello = @”hello”;
[hello shoot];
Ship *helloShip = (Ship *)hello;
[helloShip shoot];
[(id)hello shoot];
动态绑定的问题可能会引发严重的错误(如毫无节制的类型转换等)
解决动态绑定问题的思路:内省机制,协议
内省:NSObject基类提供了一系列的方法如isKindOfClass:(是否为这个类或其子类的实例),isMemberOfClass:(是否为这个类的实例),respondsToSelector:(对象是否响应某方法)来在运行时检测对象的类型。
检测方法的变量为选择器selector(SEL),使用方法如下:
if ([obj respondsToSelector:@selector(shoot)]) {
[obj shoot];
} else if ([obj respondsToSelector:@selector(shootAt:)]) {
[obj shootAt:target];
} SEL shootSelector = @selector(shoot);
SEL shootAtSelector = @selector(shootAt:);
SEL moveToSelector = @selector(moveTo:withPenColor:);
[obj performSelector:shootSelector];
[obj performSelector:shootAtSelector withObject:coordinate]; [array makeObjectsPerformSelector:shootSelector]; // 用于数组,批量对数组中的对象发送消息
[array makeObjectsPerformSelector:shootAtSelector withObject:target]; // target is an id [button addTarget:self action:@selector(digitPressed:) ...];//MVC中的target-action
1、Foundation
a.NSObject
所有类型的基类,提供了一系列通用的方法。
- (NSString *)description描述对象内容(格式化输出%@),一般在子类中自实现。
- (id)copy; // 尝试复制为不可变对象
- (id)mutableCopy; // 尝试复制为可变对象
b.NSArray
- (NSUInteger)count;
- (id)objectAtIndex:(NSUInteger)index; //返回下标为index的数组元素
- (id)lastObject; // 返回数组末尾元素
- (id)firstObject; // 返回数组头元素 - (NSArray *)sortedArrayUsingSelector:(SEL)aSelector;//使用自定义方法对数组排序
- (void)makeObjectsPerformSelector:(SEL)aSelector withObject:(id)selectorArgument;
- (NSString *)componentsJoinedByString:(NSString *)separator;//将数组转化为字符串并用separator分隔
c.NSMutableArray
+ (id)arrayWithCapacity:(NSUInteger)numItems; // numItems is a performance hint only
+ (id)array; // [NSMutableArray array] is just like [[NSMutableArray alloc] init] - (void)addObject:(id)object; // 在尾部加入元素
- (void)insertObject:(id)object atIndex:(NSUInteger)index;//在下标index处插入元素
- (void)removeObjectAtIndex:(NSUInteger)index;//移除index处元素
数组的遍历:
NSArray *myArray = ...;
for (NSString *string in myArray)
{
// no way for compiler to know what myArray contains
double value = [string doubleValue]; // crash here if string is not an NSString
} NSArray *myArray = ...; for (id obj in myArray)
{
// do something with obj, but make sure you don’t send it a message it does not respond to
if ([obj isKindOfClass:[NSString class]])
{
// send NSString messages to obj with no worries
}
}
d.NSNumber
对常用基本类型的封装
NSNumber *n = [NSNumber numberWithInt:];
float f = [n floatValue]; //便利初始化方式
NSNumber *three = @;
NSNumber *underline = @(NSUnderlineStyleSingle); // enum
NSNumber *match = @([card match:@[otherCard]]);
e.其他简单类型
NSValue、NSData、NSDate(NSCalendar,NSDataFormatter,NSDateComponents)、NSSet(NSMutableSet)、NSOrderedSet(NSMutableOrderedSet)
f.NSDictionary
//初始化方式
@{ key1 : value1, key2 : value2, key3 : value3 } //查表方式
UIColor *colorObject = colors[colorString]; //常用方法
- (NSUInteger)count;
- (id)objectForKey:(id)key;
g.NSMutableDictionary
//常用方法
- (void)setObject:(id)anObject forKey:(id)key;//添加键值
- (void)removeObjectForKey:(id)key;//移除键值
- (void)removeAllObjects;
- (void)addEntriesFromDictionary:(NSDictionary *)otherDictionary;//合并字典
//遍历方式
NSDictionary *myDictionary = ...;
for (id key in myDictionary)
{
// do something with key here
id value = [myDictionary objectForKey:key];
// do something with value here
}
h.属性列表
属性列表是一种保存数据的方式,定义为集合的集合,可以为NSArray, NSDictionary, NSNumber, NSString, NSDate, NSData。
可以对上述对象直接发送- (void)writeToFile:(NSString *)path atomically:(BOOL)atom;消息保存为属性列表文件
i.NSUserDefaults
轻量级的本地数据存储
[[NSUserDefaults standardUserDefaults] setArray:rvArray forKey:@“RecentlyViewed”]; //常用方法
- (void)setDouble:(double)aDouble forKey:(NSString *)key;
- (NSInteger)integerForKey:(NSString *)key; // NSInteger is a typedef to 32 or 64 bit int
- (void)setObject:(id)obj forKey:(NSString *)key; // obj must be a Property List
- (NSArray *)arrayForKey:(NSString *)key; // will return nil if value for key is not NSArray //保存完毕后必须进行同步
[[NSUserDefaults standardUserDefaults] synchronize];
j.NSRange
typedef struct {
NSUInteger location;
NSUInteger length;
} NSRange; //创建
NSMakeRange(NSUInteger location,NSUInteger length);
2、UIKit
a.UIColor
//系统内置颜色
[UIColor blackColor];
[UIColor blueColor];
[UIColor greenColor];
... //RGB颜色
+ (UIColor *)colorWithRed:(CGFloat)red green:(CGFloat)green blue:(CGFloat)blue alpha:(CGFloat)alpha;//alpha为透明度 //HSB颜色
+ (UIColor *)colorWithHue:(CGFloat)hue saturation:(CGFloat)saturation brightness:(CGFloat)brightness alpha:(CGFloat)alpha;
b.UIFont
//系统字体
UIKIT_EXTERN NSString *const UIFontTextStyleHeadline NS_AVAILABLE_IOS(7_0);
UIKIT_EXTERN NSString *const UIFontTextStyleBody NS_AVAILABLE_IOS(7_0);
UIKIT_EXTERN NSString *const UIFontTextStyleSubheadline NS_AVAILABLE_IOS(7_0);
UIKIT_EXTERN NSString *const UIFontTextStyleFootnote NS_AVAILABLE_IOS(7_0);
UIKIT_EXTERN NSString *const UIFontTextStyleCaption1 NS_AVAILABLE_IOS(7_0);
UIKIT_EXTERN NSString *const UIFontTextStyleCaption2 NS_AVAILABLE_IOS(7_0); //新建字体
UIFont *font = [UIFont preferredFontForTextStyle:UIFontTextStyleBody]; //常用方法
+ (UIFont *)systemFontOfSize:(CGFloat)pointSize;
+ (UIFont *)boldSystemFontOfSize:(CGFloat)pointSize;
c.UIFontDescriptor
//创建一个字体
+ (UIFont *)fontWithDescriptor:(UIFontDescriptor *)descriptor size:(CGFloat)size; //使用举例
UIFont *bodyFont = [UIFont preferredFontForTextStyle:UIFontTextStyleBody];
UIFontDescriptor *existingDescriptor = [bodyFont fontDescriptor];
UIFontDescriptorSymbolicTraits traits = existingDescriptor.symbolicTraits;
traits |= UIFontDescriptorTraitBold;
UIFontDescriptor *newDescriptor = [existingDescriptor fontDescriptorWithSymbolicTraits:traits];
UIFont *boldBodyFont = [UIFont fontWithFontDescriptor:newDescriptor size:];
d.Attributed Strings
①NSAttributeString
带属性的字符串(不是字符串),可通过字典设置一系列字符属性。
//获取特定范围的字符属性
- (NSDictionary *)attributesAtIndex:(NSUInteger)index effectiveRange:(NSRangePointer)range; //获取对应字符串
- (NSString *)string;
②NSMutableAttributeString
//常用的动态设定属性的方法
- (void)addAttributes:(NSDictionary *)attributes range:(NSRange)range;
- (void)setAttributes:(NSDictionary *)attributes range:(NSRange)range;
- (void)removeAttribute:(NSString *)attributeName range:(NSRange)range; //转化为可变字符串
- (NSMutableString *)mutableString
//举例
UIColor *yellow = [UIColor yellowColor];
UIColor *transparentYellow = [yellow colorWithAlphaComponent:0.3]; //字符串属性字典
@{ NSFontAttributeName :
[UIFont preferredFontWithTextStyle:UIFontTextStyleHeadline]
NSForegroundColorAttributeName : [UIColor greenColor],
NSStrokeWidthAttributeName : @-,
NSStrokeColorAttributeName : [UIColor redColor],
NSUnderlineStyleAttributeName : @(NSUnderlineStyleNone),
NSBackgroundColorAttributeName : transparentYellow }
//for UIButton
- (void)setAttributedTitle:(NSAttributedString *)title forState:...;
//for UILable
@property (nonatomic, strong) NSAttributedString *attributedText;
//for UITextView
@property (nonatomic, readonly) NSTextStorage *textStorage;
3、作业
无
其它:本节课主要是理论铺垫,着重API的讲解,都是很常用的对象,因此务必做到熟练使用,在今后的iOS开发中才不会出现基础问题。希望大家可以多多查阅文档,实际编程时重点理解动态绑定等概念。
课程视频地址:网易公开课:http://open.163.com/movie/2014/1/B/P/M9H7S9F1H_M9H7VPRBP.html
或者iTunes U搜索standford课程
(4/18)重学Standford_iOS7开发_框架和带属性字符串_课程笔记的更多相关文章
- (1/18)重学Standford_iOS7开发_iOS概述_课程笔记
写在前面:上次学习课程对iOS还是一知半解,由于缺乏实践,看公开课的视频有时不能很好地领会知识.带着问题去学习永远是最好的方法,接触一段时间iOS开发以后再来看斯坦福iOS公开课,又会有许多新的发现, ...
- (8/18)重学Standford_iOS7开发_协议、block、动画_课程笔记
第八课: 1.协议 另一种安全处理id类型的方式如:id <MyProtocol> obj a.声明 //协议一般放于.h文件中或者在类的.h文件中 @protocol Foo <X ...
- (6/18)重学Standford_iOS7开发_控制器多态性、导航控制器、选项卡栏控制器_课程笔记
终于有时间跟新了,两周时间复(yu)习(xi)了5门考试累觉不爱...... ------------------------------------------------------------- ...
- (9/18)重学Standford_iOS7开发_动画、自动布局_课程笔记
最近开始实习,没多少时间更新了=_= 第九课: 1.上节课demo:Dropit完整实现 https://github.com/NSLogMeng/Stanford_iOS7_Study/commit ...
- (7/18)重学Standford_iOS7开发_视图、绘制、手势识别_课程笔记
第七课: 1.View 一般来说,视图是一个构造块,代表屏幕上一块矩形区域,定义了一个坐标空间,并在其中绘制及添加触控事件等. ①视图的层级关系 一个视图只能有一个父视图,可以有多个子视图 - ( - ...
- (5/18)重学Standford_iOS7开发_视图控制器生命周期_课程笔记
第五课: 1.UITextView @property (nonatomic, readonly) NSTextStorage *textStorage;//注意为只读属性,因此不能直接更改内容,NS ...
- (3/18)重学Standford_iOS7开发_Objective-C_课程笔记
第三课: 本节课主要是游戏实现的demo,因此我将把课程中简单的几个编程技巧提取出来,重点介绍如何自己实现作业中的要求. 纸牌游戏实现: ①游戏的进行是模型的一部分(理解什么是模型:Model = W ...
- (2/18)重学Standford_iOS7开发_Xcode_课程笔记
第二课: 1.惰性初始化 -(ObjectType *)example { f(!_example) example =[[ObjectType alloc] init]; return _examp ...
- 基本数据类型-集合(set)_上周内容回顾(字符串_数字_列表_元组_字典_集合)
上周内容回顾 1.字符串 2.数字 除了布尔类型外,int.long.float和complex都可以使用的运算为:加.减.乘.除.整除.幂运算和取余 3.列表和元组 列表的内容可变,可以包含任意对象 ...
随机推荐
- Linux - tar命令过滤某个目录
tar -zcvf abc.20140325.tar.gz --exclude=./abc/kkk/--exclude=./abc/hhh/ ./abc/ 发现没有过滤成功,后来发现这种方法是不对的( ...
- simplexml 使用实例
搞了几天php处理xml文件,终于有点头绪,记录下来分享一下.simplexml 是php处理xml文件的一个方法,另一个是dom处理,这里只说simplexml.目前php处理xml用的比较多,比较 ...
- ubuntu下的supervisor启动express失败问题
ubuntu下apt-get install nodejs后的启动命令是nodejs,而不同于windows下的node 所以我在supervisor启动express的时候出现了问题 提示如下: / ...
- hdu10007
题意,很简单,给n个点的坐标,求距离最近的一对点之间距离的一半. 第一行是一个数n表示有n个点,接下来n行是n个点的x坐标和y坐标.实数. 这个题目其实就是求最近点对的距离 #include< ...
- ios开发之C语言第4天
自增和自减运算 自增运算符 ++ 自增表达式 1>.前自增表达式. int num = 1; ++num; 2>.后自增表达式 int num = 1; n ...
- docker安装caffe
[最近一直想要学习caffe,但是苦苦纠结于环境安装不上,真的是第一步都迈不出去,还好有docker的存在!下面,对本人如何利用docker安装caffe做以简单叙述,不属于教程,只是记录自己都做了什 ...
- UML 类图的关系
1. 关联关系 1.1 单向关联 . public class ClassA { private ClassB bVar; } public class ClassB { //... } 1.2 ...
- IAR ARM、IAR STM8、IAR MSP430共用一个IDE
转自IAR ARM.IAR STM8.IAR MSP430共用一个IDE 试了安装好多个不同版本不同编译器的IAR,终于明白不同编译器的IAR共用IDE的条件,把几个不同编译器的IAR安装在一起,共用 ...
- [转贴]PHP 开发者应了解的 24 个库
作为一个PHP开发者,现在是一个令人激动的时刻.每天有许许多多有用的库分发出来,在Github上很容易发现和使用这些库.下面是我曾经遇到过最酷的24个库.你最喜欢的库没有在这个列表里面?那就在评论中分 ...
- 最好的程序员都是行动派(成功者不是那些明知赚钱之法还要推三阻四的人。成功者知道轻重缓急,善于把握今天) good
我相信,所有程序员都需要在下面两点之间找到一个良好的平衡: 1.把自己关在一间私密的办公室里,针对你的程序与编译器展开一次亲密对话. 2.出入公众场合,与其他人公开谈论你的程序. 关于这个话题,我已经 ...