@interface Person : NSObject
为维西等地区用户提供了全套网页设计制作服务,及维西网站建设行业解决方案。主营业务为网站设计制作、网站建设、维西网站设计,以传统方式定制建设网站,并提供域名空间备案等一条龙服务,秉承以专业、用心的态度为用户提供真诚的服务。我们深信只要达到每一位用户的要求,就会得到认可,从而选择与我们长期合作。这样,我们也可以走得更远!
{
NSString*_name;
int _age;
} @end
#import "Person.h"
@interface ViewController :UIViewController
@property (nonatomic, retain) Person* testPerson;
@end
- (void)viewDidLoad {
[superviewDidLoad];
//创建Person对象
testPerson = [[myPerson alloc] init];
[testPerson setValue:[NSNumber numberWithInt:18] forKey:@"age"];
NSLog(@"testPerson‘s age = %@", [testPerson valueForKey:@"age"]);
}
- (id)valueForKey:(NSString *)key;
-(void)setValue:(id)value forKey:(NSString *)key;
设置就3步:
1.注册需要观察的对象的属性addObserver:forKeyPath:options:context:(一般添加self为观察者)
2.实现observeValueForKeyPath:ofObject:change:context:方法,这个方法当观察的属性变化时会自动调用(这是一个回调方法)
3.取消注册观察removeObserver:forKeyPath:context:(在dealloc里面写)
@interface Person : NSObject
{
NSString*_name;
int _age;
} @end
#import "Person.h"
@interface ViewController :UIViewController
@property (nonatomic, retain) Person* testPerson;
@end
- (void)viewDidLoad {
[superviewDidLoad];
//创建Person对象
testPerson = [[myPerson alloc] init];
[testPerson addObserver:self forKeyPath:@"age" options:NSKeyValueObservingOptionNew context:nil];
}
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
if ([keyPath isEqualToString:@"age"]) {
NSLog(@"new Age =%@", [change valueForKey:NSKeyValueChangeNewKey]);
}
}
- (void)dealloc
{
[testPerson removeObserver:self forKeyPath:@"age" context:nil];
[super dealloc];
}
感谢码迷的文章
你知道吗?IOS软件工程师已经成为软件人才中的紧缺型人才!
国内外出现大量的“IOS人才荒”,未来几年IOS人才需求缺口将达百万!
招聘网站上,IOS软件工程师依然成为各大企业哄抢的对象,不少企业为招聘这类人才,不惜花重金招揽,腾讯、联想、新浪等国内企业也毫不例外地争夺IOS软件工程师,很多IOS开发岗位年薪已高达几十万!
课程内容
内容介绍
预备阶段
1、文件管理器Finder
2、iWork使用Numbers,Keynote,Pages
3、Safari浏览器
?
?
MacOs的使用,iWork的使用
iOS开发基础
1、iOS开发的系统环境介绍、Xcode集成开发环境详解、常用软件的介绍
2、数据类型、常量和变量、运算符、赋值语句和表达式;分支、循环
3、函数,数组(一维数组、二维数组、多维数组),结构体
4、指针数组、数组指针,结构体指针
5、指向指针的指针,宏定义、枚举,const,static
?
?
?
1、Xcode、SVN
2、C语言是iOS开发的入门基础语言,本部分主要介绍C语言的基本语法,程序结构,以及指针的各种操作。
为接下来Objective-C语言的学习打下基础。
?
1、面向对象(OOP)和面向过程、类(Class)和对象(Object)、类的定义
2、创建对象、self和super关键字、属性以及点语法(nonatomic,assign、retain、copy,readonly、readwrite)
3、便利构造器、单例(Singleton)
4、堆栈、内存管理(alloc、copy、retain,release、autorelease,strong、weak)
5、键值编码(KVC)、键值监听(KVO)、通知(NSNotification)
6、类目(Category)、延展(Extention)、协议(protocol)
?
?
?
?
?
?
?
Objective-C是iOS与MacOS开发的主要语言,它是对C语言的扩展,并融入了面向对象的特点。
包含封装、继承、多态三大特性,本部分主要介绍OC的基本语法,新的特性,内存管理等内容
?
1、字符串(NSStringNSMutableString)、数值对象(NSNumberNSValue)
2、数组(NSArray,NSMutableArray)、字典(NSDictionary,NSMutableDictionary)、集合(NSSet,NSMutableSet)、快速枚举(for?in)NSIndexPath
3、日期与时间(NSDate)、日期格式(NSDataFormatter)、日历(NSCalendar)、定时器(NSTimer)
4、文件管理(NSFileManager)、程序包(NSBundle)、缓冲区(NSData)
5、网络连接(NSURLConnection)、网络地址(NSURL)、网络请求(NSURLRequest)、请求回应(NSResponse)、错误信息处理(N0SError)
6、MVC编程,简单控件一:标签(UILabel)、文本输入(UITextField)、按钮(UIButton)、提示框(UIAlertView、UIActionSheet
7、使用面向对象OOP方法,实施计算机APP应用.要求学员应用前期学习中的大部分知识点
?
?
?
?
?
iOS的基础框架,包含了iOS开发的基本数据类型,在iOSSDK中几乎部NS开头的类都属于这个框架,我们将详细介绍开发中常用的类。
iOS开发
1、窗口(UIWindow)、视图(UIView)、应用程序(UIApplication)
2、绘图(drawRect)、QuartzCoreDemo、CGContextRef
3、触摸(UITouch)、事件(UIEvent)、手势(UIGestureRecognizer)、UIResponder、消息传递、响应者链
4、UIView以及CALayer动画(CAAnimation、CABasicAnimation、CAKeyFrameAnimation)
5、活动提示(UIActivityIndicatorView)、图像(UIImageView)
6、控件二:滚动视图(UIScrollView)、页控制器(UIPageControl)、开关(UISwitch)、单选(UISegmentControl)、滑块(UISlider)
7、控件三:多行文本(UITextView)、网页视图(UIWebView)、滚轮(UIPickerView)、日期滚轮(UIDatePickerView)、表格视图(UITableView)、表格项(UITableViewCell)
8、视图控制器(UIViewController)、导航控制器(UINavigationController)、标签控制器(UITabBarController)、表格控制器(UITableViewController)、相册控制器(UIImagePickerController)
?
?
?
?
?
?
?
?
?
?
?
?
?
?
UIKit处于Cocoa四层结构的上层CocoaTouch层,是iOS开发中的控件框架,定义了几乎部可视化控件,在iOS开发中占据地位,我们不会学习各个控件的用法,而且会讲述各个控件在不同版本系统里的样式,教大家如何自定义控件样式。
学完他们我们就可以做自己个性化的界面了。
结合前期所学知识,应用UIKit框架详解中所学的UI控件及知识点,模拟实现Safari浏览器
iPhoneSafari浏览器原型App。
1、音频播放(AVAudioPlayer)、视频播放(MPMoviePlayerViewController)以及播放ipod音乐
2、照相机(UIImagePickerController)以及相册的使用
3、短信(MFMessageComposeViewController)、邮件(MFMailComposeViewController)的使用
4、加速计(UIAccelerometer)的使用、帐号注册、真机调试、上传程序
5、地图(MKMapView)的使用以及定位(CoreLocation)
6、数据持久化(文件读写、sqlite数据库、归档、NSCoding协议)、云存储(iCloud)
7、多线程开发(NSThread、NSLock),操作队列(NSOperationQueue)
8、网络请求(GET、POST)、xml解析、json解析、Socket编程
?
iOS应用特性框架是对上述两个框架之外其他框架的统称。
主要课程内容为:音频、视频的播放、照相机的使用、加速计的应用,地图框架的使用、短信、邮件的应用等等,而且也会介绍当前应用开发中使用非常广泛的开源框架,同时还将讲解开发者帐号的注册、真机调试、以及程序上传。
iOS游戏开发
1、Cocos2DHelloWorld,CCDirector(导演类),CCScene(场景类),CCLayer
2、CCSprite(精灵类),CCAction(动作)
3、CCMemu(菜单),CCLabelTTF(标签)
4、CCPointParticleSystem(点粒子系统)
5、练习:植物大战僵尸游戏开发
?
2D游戏引擎的使用,部课程内容以"植物大战僵尸"为例,贯穿其中
1、在Xcode下编译C++程序,C++类Class,成员变量,成员函数,对象的创建
2、构造函数与析构函数,newdelete关键字,内存管理
3、继承,函数重载,操作符重载,拷贝构造
4、模版template与泛型
5、Objective-C与C++混合编程
?
C++是目前流行的开发语言之一,C++基本语法,C++面象对像的特性.在XCode下如何使用C++语言编程.
1、物理世界(b2World),刚体(b2Body),精灵与刚体连接
2、碰撞测试(b2ContactListener)
3、刚体的连接关节(b2Joint)
4、练习:愤怒的小鸟开发
5、OpenGLES开发基础
?
iOS游戏开发中使用多的物理引擎,以愤怒的小鸟为例学习Box2D开发.
项目实训
项目会用到网络、数据库、各种常用控件、以及各种Foundation类。
目前有很多项目可以选择使用,比如:互动百科(新闻类应用)、乐视(电影类应用)、创业邦(杂志类应用)、尚品网(购物类应用)、雅座空间(团购类应用)、找地(定位类应用)、我是数学家(教育类应用)、YY客户端(语音类应用)、麦咨达(条码扫描类应用)、中国建行(银行类应用)、CuteMath(游戏类应用)、车震摇摇乐(娱乐类应用)、新浪微博(微博类应用)等等
老师程带领学生做一个真实项目,从需求分析开始带起,然后技术调研,工期评估、编码、测试、优化代码、上传程序等项目内容会包括几点:网络数据解析、团队协调、版本管理、制作文档、复杂表布局、制作CELL类、动画应用、定位、方向地址解析、百度地图应用
在iOS开发过程中,我们经常会听到或者用到KVO/KVC,但是对于什么是KVO和KVC,我们可能没有那么了解。下面先让我们来了解一下什么是KVC.
什么是KVC
在苹果的官方文档中是这样描述KVC的:它是一种通过字符串描述符而不是通过调用访问方法或者直接使用实例变量的非直接的访问对象属性的机制,说白了就是KVO是一种通过非常规方法访问成员变量或者属性的机制,这种非常规方式就是通过一个字符串标示符也就是所谓的key来访问属性或者成员变量。而这个key一般就是属性名或者实例变量名。
对于KVC的基本的方法都定义在NSKeyValueCoding的非正式协议中,并且NSObject默认实现了该协议。
KVC不仅支持对象类型,也支持数值类型和结构体。非对象类型的参数和返回类型会自动封装成NSValue或NSNumber类型。
KVO可以用来访问三种不同的对象值类型:属性、一对一关系、一对多关系
属性可以是诸如数值、字符串、bool类型等简单的值。也可以NSNumber或者NSColor这样的对象值。
在一对一关系里的对象可以拥有它自己的属性,这些属性可以在不改变对象的情况下被改变。像UIView的superView的属性,我们可以更改superView的属性,而不需要更改UIView。
一对多属性是一些相关对象的集合。通常用NSArray或者NSSet来存储这些集合。KVO也允许用户自定义集合类,但依然是像访问NSArray或者NSSet一样访问它们。
键和键路径
键是用来标识一个对象属性的字符串。一般情况下,键就是访问方法或者是对象的实例变量的名字。键必须是ASCII编码,以小写字母开头,并且不能包含空格。举几个键的例子:age、firstName、lastNmame等。
键路径是一串由点分隔的键组成的字符串,它是用来遍历一系列的对象属性的。第一个键的属性是跟接收者相关的,而每一个子系列是跟前一个属性相关的。比如键路径address.street,这个键路径会首先从接收者获得address属性,然后从address属性中获得street属性。
用KVC获得属性的值
方法valueForKey:会返回跟接收者相关的key的值。如果对于指定的key没有访问器或者实例变量,则给自己发送一个valueForUndefinedKey:消息,这个方法的默认实现是抛出一个NSUndefinedKeyException。子类可以重写这个方法。
同样的,valueForKeyPath:返回跟接收者相关的键路径的值。对于子系列中任何不遵循KVC的对象,都会收到一个valueForUndefineKey:消息。
dictionaryWithValuesForKeys:会检索数组中所有跟接收者相关的key的值。返回的NSDictionary中包含了数组中所有key的值。
注意:集合对象,比如NSArray、NSSet和NSDictionary中不能将nil作为一个值。相反的,应该用NSNull对象代替nil。NSNull是一个代表nil的对象属性。dictionaryWithValuesForKeys:和setValuesForKeysWithDictionary:方法的实现中,默认会在nil和NSNull之间进行转换。在你的对象中,不需要对nil做显示的测试。
用KVC设置属性的值
方法setValue:forKey:是将接收者中相关key的值设置成指定的值。在这个方法的实现中,会将NSValue的值转换成普通的数值然后赋给属性。
如果指定的key不存在,会给接收者发送一个setValue:forUndefinedKey:消息。这个方法的默认实现是抛出一个NSUndefinedKeyException异常,子类可以重写这个方法来自定义默认行为。
方法setValue:forKeyPath:的实现跟前面的一样,只不过它是用来处理键路径的。
setValuesForKeysWithDictionary:方法是用指定字典里的值来赋给接收者相关的属性。这个方法的默认实现是对每一对键-值都调用一次setValue:forKey:方法,并且自动将nil转成NSNull。
最后,你要关心的当尝试将一个nil值赋给一个非对象类型的时候该怎么办。这种情况下,接收者会发出一个setNilValueForKey:消息,这个方法的默认实现是抛出一个NSInvalidArgumentException。在你的应用中可以重写这个方法来定义一个默认值,然后用新的值触发setValue:forKey
第一步:编程入门课
时间预计:4个星期
推荐看公开课,Udacity也行,网易公开课也行,自己找一个面对对象语言(一般是JAVA, C++, Python)的课。我是在网易公开课看的斯坦福的CS106A,学的JAVA。
如果你纯粹学iOS开发,不推荐看哈佛CS50,CS50是给CS系的学生介绍整个计算机世界的框架,讲的内容比较多,进度比较快,对iOS开发其实有点累赘了。(臣妾有点跟不上啊!!)
计划安排是一天一课,看课程要求的书(至少看完一本)及大部分作业。这一阶段重点不是语法,而是以下3个目标。
目标:
1. 让自己对编程这件事感到适应。
写hello world。
怎么写function, 怎么调用function。
全局变量,局部变量这类基本知识点。
都是基本的东西。看看书,写多两个程序就欧啦。
2. 掌握编程语言的基本要素。
编程语言4个要素:
a. 基本的数据类型:整数,实数,character, string, boolean
b. 基本的运算符号:+-×/++--那啥的
c. 怎样输入输出
d. 怎样控制程序:sequence,selection,loop
3. 了解编程范式
面对过程编程。
面向对象编程。
第二步:上手iOS!
时间预计:2星期
强烈推荐CS193P,老头子讲的超级好!我的很多东西(对象思维啥的)是在这里跟着做练习的时候才真正明白的(好啦,也可能是上一堂课练习做得少的原因)。如果等到9月应该itunes U上会开始教iOS 7了。网易公开课的是2010年iOS 5版的,前10堂课,也行。(iTunes U上有完整的课)
CS193P说有prerequisite,一开始被吓到,事实证明还是可以学下去的。头两节课一头雾水,没关系,把itunes U上的课件下载下来,把所有代码打出来,然后一个个元素对应之前学的语言匹配,再不懂先放着,继续学后边的,过几天打多点代码就懂了。
感觉学5、6堂课,一个星期左右就可以开始进入下一阶段自己做东西了。之后用啥学啥,每堂课都有主题的。速度慢点的同学们,这阶段跟我一样准备两个星期吧!
第三步:开发app!
时间预计:2星期(本人...1个半月,实在不好意思说出口)
这个时间就可长可短啦,还包括美工,交互啥的。坚持要用啥学啥的原则,其实就是知道iOS SDK都有什么组件,每个组件有什么function而已。stackoverflow, Github, apple sample code多上,搜索引擎多用。如果有个师傅,这个阶段真的是进步神速。
好的!不出意外,你的第一个app就这么新鲜出炉了!从今天开始,成为一个冷艳逼格高尚的iOS开发者吧!
修改私有属性,是我们日常开发中常见的一个场景。比如修改三方库的某个属性,可三方库并没有暴露该属性在头文件。总的来说,修改私有属性,两种方案:KVC和Runtime。今天这里不介绍原理,只讲实操。
总体思路:通过继承要修改类,拿到要修改的属性或者成员变量,改变其值,再赋值给该类。
以下举例,通过子类ZXSonViewController继承父类ZXParentViewController和,在viewDidLoad方法里做演示。
父类定义了私有属性name
子类继承父类,通过KVC修改
此时使用的Api由[setValue: forKey:]换为[setValue:forKeyPath:]
父类使用自定义类一个作为属性
子类通过[setValue:forKeyPath:] 修改
当修改的是成员变量时
子类
由于struct本身并不遵循KVC协议,但是我们可以转化为NSValue解决
父类使用一个枚举做成员变量
子类通过五步操作,修改父类成员变量值
截图如下
看下打印结果
通过KVC修改私有属性或者成员变量的方法基本都列举完了,但注意KVC本身属于硬编码形式,容易操作闪退,使用时要做好安全防护。
简单来说, 是的.
KVC在某些时候比较有用, 比如需要用到某个深层次的对象的某些私有属性, 比如你可能会遇到需要使用UIView的某些私有属性(如果你知道这些属性的key).
但常规的开发中来说, 就目前为止, 我还没发现KVC存在的价值.