Object-C基础学习笔记(1)

一、苹果公司将Cocoa、Carbon、QuickTime和OpenGL等技术做为框架集;
提供Cocoa组成部分有:
(1)Foundation框架(有不少有用的,面向数据的低级类和数据结构);
(2)Application Kit(也称AppKit)框架(包含了全部的用户接口对象和高级类,例如NS……),
还有一个支持框架的套件,包括Core Animation和Core Image。shell

NS前缀
在IOS开发中,常常会遇到NS开头的对象,这个要从乔帮主历史恩怨提及。
当年Steve Jobs 和John Scullery与恩怨,乔帮主当年被人挤兑出苹果,自立门户的时候作了个公司叫作NextStep,
里面这一整套开发包非常让一些科学家们喜欢,而如今Mac OS用的就是NextStep这一套函数库。 数据结构


 

二、NSLog() 至关于 print()
NSLog(@"hello Object-c");
//注:@是Objective-C在标准C语言基础上添加的特征之一,双引号的字符串前面有一个@,
这表示引用的字符串应该做为Cocoa的NSString元素处理
NSLog(@"are %d and %d different? %@",5,5,boolString(areTheyDifferent));
/注意%@:使用NSLog输出任何对象值时,都会使用这个格式说明 框架


三、BOOL使用8位存储,YES定义为1,NO定义为0,大于1不为YES,跟标准C不一样。
若不当心将一个长于1字节的整型值赋给BOOL,则只截取低八位
Obejective-C中1不等于1,绝对不要将BOOL值和YES比较iphone


四、Object-C语法结构:函数

在Objective-C里面没有public和private的概念,你能够认为全是public;
它只有类方法和实例方法,加号(+)表示类方法,类方法能够直接调用,而不用建立这个类的实例;
减号(-)表示实例方法,须要建立这个类的实例对象才能够调用。
如:(Object-C)
-(void)hello:(BOOL)ishello
{
//XXOO
}
(C#/Java)
private void Hello(bool ishello)
{
//XXOO
}ui

如何调用刚才写的方法(Object-C中说消息)
(Object-C)
[self hello:Yes];
(C#)
this.hello(true);this


 

五、比较常见的函数库:
NSLog、NSString、NSInteger、NSURL、NSImageatom

还能够看到其余名字打头的一些类,好比CF、CA、CG、UI等等
CF说的是Core Foundation,CA说的是Core Animation,CG说的是Core Graphics,UI说的是iPhone的User Interface设计


 

六、Object-C常见语法说明:
1 头文件引用使用 #import “文件名”或者 #import <文件名>的形式以确保每一个头文件仅被包含一次;
2 类声明以 @interface 类名:继承类 开头,以 @end 结尾,类实现以@implementation 类名 开头,以 @end 结尾;
3 实例方法,即成员方法,在方法名前面添加一个减号(-);类方法,在方法名前面添加一个加号(+);
4 类方法的调用格式为 [类名 类方法],成员方法调用格式为 [实例名 实例方 法],这种模式在ObjC中被称为消息机制,
[对象 消息]即给对象发送了一个消息,产生的 效果就是该对象调用了该类中定义的对应的实例方法;

如:(Object-C)

Print类.h文件(声明文件)
++++++++++++++++++++++++++++++
#import <Foundation/Foundation.h>

@interface Print:NSObject{//Object-C的全部类都继承于NSObject
//成员属性
NSString *caption;
NSString *photographer;
}

//在Object-C2.0引入了属性合成,至关于C#中的get/set方法
@property(nonatomic,copy)NSString *caption;
@property(nonatomic,copy)NSString *photographer;

//类方法
+(NSString*)printName;

@end

Print类.m文件(实现文件)
++++++++++++++++++++++++++++++
@implementation Print

@synthesize photographer;

@synthesize caption;

//类方法
+(NSString*)printName
{
return (@"Print Result");
}

@end

Print类使用
++++++++++++++++++++++++++++++

#import 'Print.h'

int main(int argc,const char *argv[])
{
NSAutoreleasePool *pool=[[NSAutoreleasePool alloc]init];
return NSApplicationMain(argc,(const char**)argv);
//类方法的调用
NSLog(@"ClassName=/"%@/"",[Print printName]);

//初始化
Print* p=[[Print alloc]init];

//设置器调用
[p setCaption:@"MyCaption"];
[p setPhotographer:@"MyPhotographer]"];

[pool drain];

return 0;
}

运行结果:
2015-05-2 11:12:13.715 demo[1471:903] ClassName = "Print Result" 指针

2015-05-2 11:12:13.718 demo[1471:903] Caption = "MyCaption"

2015-05-2 11:12:13.718 demo[1471:903] Photographer = "MyPhotographer

PS:
苹果公司的iphone平台采用Objective-C作为native language的开发,Objective-C的内核是C语言的,
并基于C语言实现OOP的一些特性。Objective-C是对C语言的扩展,这和C++的前身Better-c有很大的类似之处,
Objective-C的新版本里实现了和Java相似的垃圾回收机制,但基于iphone平台的资源限制,
iphone平台并不支持垃圾回收机制。


总结: 一、Object-C方法调用(Calling Methods): [object method]; [object methodWithinput:input]; 二、对象方法的返回值 output=[object methodWithOutput]; output=[object methodWithinputAndOutput:input]; 三、建立对象 id myObject=[NSString string]; //id指的是任意类型,为指针。这里便可: NSString* myString=[NSString string]; //全部的Object-对象变量都是指针类型 四、嵌套消息调用(Nested Messages) 如:function1(function2()); (Object-C) [NSString stringWithFormat:[prefs format]]; //避免一行代码里嵌套调用超过两个 五、多参数输入的方法(Multi-Input Methods) 定义一个多输入参数的方法: -(BOOL)writeToFile:(NSString*)path atomically:(BOOL)userAuciliaryFile; 调用该方法: BOOL result=[myData writeToFile:@"tmp/log.txt" atomically:NO]; //参数不必定要给它命名,在运行期,系统的这个方法的真实名字叫writeToFile:atomically: 六、Accessors(Getter&Setter)--访问器 //在Objective-C里面全部的实例对象默认都是私有的。 //全部在大多数状况下咱们须要用accessors去读取或者设置变量的值。 //设置对象变量的值有如下两种方式: [photo setCaption:@"Day at the Beach"]; output =[photo caption];//该代码并不是直接去读对象实例的变量,实际上它调用的是名为caption的方法。 方括号:都是向一个对象或者一个类发送一个消息 七、Dot Syntax (.语法) //在Object-c2.0里,新增了一个"."操做,在Mac OS X 10.5里使用了Object-C2.0语法 photo.caption=@"Day at the Beach"; output=photo.caption; //注:这两种方式均可以使用,但在一个工程里最好保持风格一致,只使用某一种。 八、建立对象 主要有两种方式建立对象 第一种:NSString* myString=[NSString string]; //注:习惯的风格,在这种状况下,咱们建立的是系统自动释放的(autoreleased)类型的对象。 第二种:NSString* myString=[[NSString alloc]init]; //注:这是嵌套的方法调用。第一个调用的NSString的本身的alloc方法。 //较为底层的调用,建立了内容、以及实例化了一个对象。 //咱们在这里能够用不一样的初始化方式去赋初值 NSNumber* value=[[NSNumber alloc]initWithFloat:1.0]; 九、基本内存管理 //假如咱们正在为Mac OS X开发一个应用程序,咱们能够选择是否启用垃圾回收机制。 //这就意味着咱们不须要去考虑内存管理,除了一个特别复杂的情形咱们须要处理一下。 //然而,咱们有的时候咱们的开发环境没有垃圾回收机制,好比iPhone开发的时候就没有垃圾回收机制。 //在这种状况下,咱们就须要了解一些基本的内存管理方面的概念。 //假如咱们手动的经过alloc建立了一个对象,咱们须要用完这个对象后release它。 //咱们不须要手动的去release一个autoreleased类型的对象,假如真的这样去作的话,咱们的应用程序将会crash。 //string1 will be released automatically NSString* string1 =[NSString string]; //must release this when done NSString* string2=[[NSString alloc]init]; [string2 release]; //如今暂且认为凡是autoreleased的对象在调用完成后就会被释放,之后还需进一步的完善 十、设计类 //对于Object-C语言而言,建立一个类很是简单,它分为两个部分 //类的接口一般保存在ClassName.h文件里,它定义了实例的参数,以及一些公开的方法。 //类的实如今ClassName.m文件里。它包含了真正运行的代码和那些方法。 //它还常常定义一些私有的方法。这些私有的方法对于子类是不可见的。 如:有个类名为Photo的接口文件:Photo.h 代码以下: #import @interface Photo:NSObject{//声明Photo类,继承自NSObject类 //定义成员变量,这里是NSStrig*类型,也能够为任意类型id类型 NSString* caption; NSString* photographer; } //增长方法,Object-C方法不须要加get前缀。 //Getters,返回类型为NSString*类型 -(NSString*) caption; -(NSString*) photographer; //Setters,返回类型指定为void类型 -(void)setCaption:(NSString*)input; -(void)setPhotographer:(NSString*)input; @end Photo类的实现,代码以下: #import "Photo.h" //getters 实现 @implementation Photo -(NSString*)caption{ return caption; } -(NSString*)photographer{ return photographer; } //setters -(void) setCaption:(NSString*)input{ [caption autorelease]; caption=[input retain]; } -(void) setPhotographer:(NSString*)input{ [photographer autorelease]; caption=[input retain]; } //在支持垃圾回收的环境里,咱们能够直接赋值就能够了 //如: //-(void) setCaption:(NSString*)input{ // caption=input; //} @end

相关文章
相关标签/搜索