1、1980年代初,Brad Cox发明了Objective-C;
2、1985年乔布斯成立了NeXT公司,创建了NextSTEP,使用Objective-C开发的用户界面工具包;
3、1996年,苹果公司收购NeXT公司,NextSTEP被重新命名为Cocoa,应用在了Macintosh编程上;
4、2007年,iPhone发布,Objective-C又是iOS平台软件开发的语言,直到2010年,iphone 4的推出,将苹果公司置于科技界顶峰,Objective –C也越来越多的人学习;
5、Objective-C是C语言的扩展集:
封闭的编程语言
动态语言
6、Objective-C与C的不同点:
Objective-C是面向对象的语言,C是面向过程的语言;
解决同样的问题,面向对象与面向过程分别使用了两种不同的思维
a)面向过程思路:侧重于事件的每一个步骤
b)面向对象思想:侧重于达到目标的方式和结果
1、第1步:打开Xcode,在Xcode菜单中(位于屏幕顶端)选择 File > New > Project,或在Xcode欢迎界面中点击“Creat a new Xcode project”。
2、第2步:选择工程环境(OS X > Application)与模板(Command Line Tool)。
3、第3步:配置工程模板信息。
4、第4步:选择存储路径;
// 1、导入头文件
#import
// 2、main函数
int main(int argc, const char * argv[]) {
// 3、自动释放池
@autoreleasepool {
// insert code here...
// 4、NSLog输出
NSLog(@"Hello, World!");
}
// 5、返回值
return 0;
}
1、‘@’ 代表什么意思?
‘@’可作为OC关键字的起始;
使用‘%@’可自动调用 description 方法对对象进行描述;
在iOS5 之后,对部分数据类型的简写,比如:@(1)、@""、@[]、@{}
等;
表示字符串的开始;
2、‘NSLog()’什么意思?和‘printf()’有何区别?
‘NSLog()’ 为OC输出语句;
与‘printf()’函数相比,‘NSLog()’会自动换行,且多了时间戳,相当于打印日志信息;
3、‘#include’和‘#import’有和区别? ""
和 <>
有和区别?
‘#include’引入C资源库,‘#import’引入OC资源库;
<>
系统存在的,""
用户自定义的;
1、类(class):对一类事物抽象的描述(抽象);
2、对象(object):从一类事物中具体化出来的一个实例(具体);
1、第1步:在工程中选择File > New > File 或使用快捷键 command + N;
2、第2步:选择工程环境(OS X)与模板(Source > Cocoa Class);
3、第3步:配置工程模板;
1、分析此前创建的类,其文件分为2部分:
.h文件为类的声明文件,关键字 @interface
用来表示类的接口。
.m文件文件为类的实现文件,关键字 @implementation
用来表示类的实现。
2、接口部分:
@interface Student : NSObject
@end
3、实现部分:
#import "Student.h"
@implementation Student
@end
4、接口和实现都必须使用@end
结束,即:@interface @end
和@implementation @end
成对出现。
5、接口作用:
告诉用户它定义的类在继承树种是如何与别的类链接的,而且对哪些类作了引用;
告诉编译器它所定义的对象应包含哪些实例变量;
告诉用户它有哪些方法可以调用(仅供类实现内部使用的方法不再接口中声明);
OC语言只支持单继承,一个子类只有一个父类,多继承可以使用类别及协议;
NSObject是所有类的根类,任意OC的类都源于NSObject;
NSObject * 可以简写为id,同时id也可以代表所有对象类型(类似void *泛型指针);
所有子类都可以使用父类的方法,所有对象都能使用NSObject类的方法;
使用%@可以打印任意对象的信息;
对象本质上都是指针,可以直接通过 == 或 != 判定2个对象是否是同一个。
在类的声明中添加的,可以在这个类中使用的变量。
某种意义上,类似于结构体的成员变量。
给Person类增加几个全局变量:
@interface Person : NSObject {
NSString *_name; /**< 姓名 */
NSString *_code; /**< 身份证 */
NSInteger _age; /**< 年龄 */
}
NSString *
, 因为他们需要用OC字符串对象来描述,而_age的类型是NSInteger
,不需要*
,因为它只需要用数值来描述即可。类的定义完成后,编译器会在内存中自动生成唯一的类对象,实例对象都是通过调用类对象的类方法生成的,类对象是工厂,同时也是蓝图,实例对象是产品。
Objective-c创建对象需要两个基本步骤:
内存分配:为新的对象动态分配一段内存地址;
初始化:为这段内存空间中填上合适的初始值;
1、分步初始化
ClassA *a = [ClassA alloc]; // 对象生成和空分配
[a init]; 初始化
2、一步到位初始化
ClassA *a = [[ClassA alloc] init];
1、类方法: +
号方法,即通过类名直接访问的方法;
2、实例方法: -
号方法,即必须通过类实例化对象后才能访问,不能直接通过类名访问的方法;
3、在面向对象中习惯上把函数叫做方法。函数是面向过程的产物,方法是面向对象的产物。Objective-C里的方法声明包含以下几个部分:
方法标识:+
号表示类方法,-
号表示实例方法;
方法的返回值;
方法的名称;
方法参数的个数,顺序以及类型;
+|- (返回值)方法名(参数名1:参数类型1, 参数名2:参数类型2...) { 方法体 }
// 示例1:实例化方法
- (id)initWithFrame:(CGRect)frame;
// 示例2:类方法
+ (UIButton *)buttonWithType(UIButtonType)type;
#import "Person.h"
@implementation Person
- (instancetype)init {
self = [super init];
if (self) {
_name = @"Admin";
_code = @"11021";
_age = 22;
}
return self;
}
#import
@interface Person : NSObject {
NSString *_name; /**< 姓名 */
NSString *_code; /**< 身份证 */
NSInteger _age; /**< 年龄 */
}
- (instancetype)initWithName:(NSString *)name code:(NSString *)code age:(NSInteger)age;
#import "Person.h"
@implementation Person
- (instancetype)initWithName:(NSString *)name code:(NSString *)code age:(NSInteger)age {
if (self = [super init]) {
_name = name;
_code = code;
_age = age;
}
return self;
}
@end
Person.h
文件,并通过自定义 init 初始化方法创建对象#import
#import "Person.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
#pragma mark
#pragma mark - init 初始化对象
// 创建对象步骤:
// 1、导入类;
// 2、分配内存初始化;
// 3、使用临时变量接收其返回值;
Person *person = [[Person alloc] init];
NSLog(@"%@", person);
#pragma mark
#pragma mark - 自定义初始化
Person *person = [[Person alloc] initWithName:@"Petter" code:@"1231111" age:22];
}
return 0;
}
+ (instancetype)personWithName:(NSString *)name code:(NSString *)code age:(NSInteger)age;
+ (instancetype)personWithName:(NSString *)name code:(NSString *)code age:(NSInteger)age {
Person *person = [[Person alloc] initWithName:name code:code age:age];
return person;
}
Person *person = [Person personWithName:"Admin" code:"1231111" age:23];