第四课(干货课):

  (最近要复习考试,有点略跟不上节奏,这节课的内容还是比较重要的,仔细理解掌握对今后的编程会有很大影响)

  本节课主要涉及到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. (1/18)重学Standford_iOS7开发_iOS概述_课程笔记

    写在前面:上次学习课程对iOS还是一知半解,由于缺乏实践,看公开课的视频有时不能很好地领会知识.带着问题去学习永远是最好的方法,接触一段时间iOS开发以后再来看斯坦福iOS公开课,又会有许多新的发现, ...

  2. (8/18)重学Standford_iOS7开发_协议、block、动画_课程笔记

    第八课: 1.协议 另一种安全处理id类型的方式如:id <MyProtocol> obj a.声明 //协议一般放于.h文件中或者在类的.h文件中 @protocol Foo <X ...

  3. (6/18)重学Standford_iOS7开发_控制器多态性、导航控制器、选项卡栏控制器_课程笔记

    终于有时间跟新了,两周时间复(yu)习(xi)了5门考试累觉不爱...... ------------------------------------------------------------- ...

  4. (9/18)重学Standford_iOS7开发_动画、自动布局_课程笔记

    最近开始实习,没多少时间更新了=_= 第九课: 1.上节课demo:Dropit完整实现 https://github.com/NSLogMeng/Stanford_iOS7_Study/commit ...

  5. (7/18)重学Standford_iOS7开发_视图、绘制、手势识别_课程笔记

    第七课: 1.View 一般来说,视图是一个构造块,代表屏幕上一块矩形区域,定义了一个坐标空间,并在其中绘制及添加触控事件等. ①视图的层级关系 一个视图只能有一个父视图,可以有多个子视图 - ( - ...

  6. (5/18)重学Standford_iOS7开发_视图控制器生命周期_课程笔记

    第五课: 1.UITextView @property (nonatomic, readonly) NSTextStorage *textStorage;//注意为只读属性,因此不能直接更改内容,NS ...

  7. (3/18)重学Standford_iOS7开发_Objective-C_课程笔记

    第三课: 本节课主要是游戏实现的demo,因此我将把课程中简单的几个编程技巧提取出来,重点介绍如何自己实现作业中的要求. 纸牌游戏实现: ①游戏的进行是模型的一部分(理解什么是模型:Model = W ...

  8. (2/18)重学Standford_iOS7开发_Xcode_课程笔记

    第二课: 1.惰性初始化 -(ObjectType *)example { f(!_example) example =[[ObjectType alloc] init]; return _examp ...

  9. 基本数据类型-集合(set)_上周内容回顾(字符串_数字_列表_元组_字典_集合)

    上周内容回顾 1.字符串 2.数字 除了布尔类型外,int.long.float和complex都可以使用的运算为:加.减.乘.除.整除.幂运算和取余 3.列表和元组 列表的内容可变,可以包含任意对象 ...

随机推荐

  1. CentOS 6.4 使用YUM 安装MySQL5.5

    1.首先需要下载Yum的支持包: http://dev.mysql.com/get/mysql-community-release-el6-5.noarch.rpm 2.下载完成后将Yum库导入到你的 ...

  2. 【javascript 动态添加数据到 HTML 页面】

    今天简单的学习了一下有关对象字面量的定义和 javascript 如何取出对象字面量的值的知识,javascript 动态添加数据到 HTML 页面的问题. [学习目标]有如下的一组数据通过 Ajax ...

  3. Visual C++ 6.0常用快捷键

    一.常用编译相关的快捷键 1.编译(单个文件)  Ctrl+F7 2.连接 F7 3.运行  Ctrl+F5 二.常用调试相关的快捷键 1.GO(全速运行)  F5 2.Stop Debuging(停 ...

  4. EXCEL : We can't do that to a merged cell.

  5. 设置UITextField的placeholder的颜色

    [textField setValue:[UIColor redColor] forKeyPath:@"_placeholderLabel.textColor"];

  6. 15 个响应式的 jQuery 图像滑块插件

    设计师和开发人员总是试图使用新技术让网站更智能,而我们发现在许多网站上 jQuery 的图像滑块插件是非常受欢迎的.本文继续介绍 15 个 jQuery 图像滑块插件以供您选择. ELASTISLID ...

  7. 【技术贴】解决Program Files文件夹消失

    好久不写程序了,今天良心发现,就寻找一下自己是否安装了JDK,习惯性的去C盘的Program Files的文件夹下面去找,次奥,没有这个文件夹.好吧.是在玩我么. 于是 打开cmd 输入如下命令 AT ...

  8. hdu 1827

    强连通分量——tarjin算法: 这题的思路就是找出多少个出度为0的连通分量,结果就是这些连通分量的元素的最小值相加: 一道很简单的题,改了我好久,= =!~ 贴代码: #include<cst ...

  9. 找到个好的讲PYTHON FILE IO的文档,收藏

    现在我感觉快入门了哈, 这两天,可以用PYTHON写一点自己想要实现的东东了. 但文件,IO,编码,邮件,始终有点续不完全. 这个文档,我看行.. http://www.dabeaz.com/pyth ...

  10. [转贴]JAVA:RESTLET开发实例(三)基于spring的REST服务

    前面两篇文章,我们介绍了基于JAX-RS的REST服务以及Application的Rest服务.这里将介绍restlet如何整合spring框架进行开发.Spring 是一个开源框架,是为了解决企业应 ...