您的位置:首页 > 职场人生

黑马程序员--Obeject-C语法知识笔记小总结

2014-07-16 17:54 295 查看
----------------------ASP.Net+Unity开发.Net培训、期待与您交流!
----------------------

一、Objective-C代码的文件扩展名

扩展名 内容类型

.h头文件。头文件包含类,类型,函数和常数的声明。

.m源代码文件。这是典型的源代码文件扩展名,可以包含Objective-C和C代码。

.mm源代码文件。带有这种扩展名的源代码文件,除了可以包含Objective-C和C代码以外还可以包含C++代码。仅在你的Objective-C代码中确实需要使用C++类或者特性的时候才用这种扩展名。

#import选项和#include选项完全相同,#import只是它可以确保相同的文件只会被包含一次。

二、字符串

NSString* myString = @”MyString”;

用双引号,助记符号 @

三、数据类型

1、 id:

Objective-C有一种比较特殊的数据类型是id。你可以把它理解为“随便”。

在Objective-C里,一切东西都是指针形式保存,你获取到的就是这个对象在内存的位置。那么id就是你知道这个位置,但是不知道里面是啥的时候的写法。

2、 同一个数组可以保存不同的对象:

3、BOOL,YES,NO:

你可以认为YES表示C#里的true,NO表示false。而实际上YES是1,NO是0,BOOL本身就是个char

4、IBOutlet、IBAction

IBOutlet就是一个显式的引用访问标记。

IBAction就是一个方法的显式引用标记。IBOutlet声明插座变量,IBAction声明事件方法,其实可理解为void,只是告诉编译器这些变量和方法是和View上的东东打交道的

IBOutlet是控件的引用,比如我想在程序中对控件进行操作,那么就需要将控件声明为IBOutlet。IBAction是控件要执行的动作或事件

5、nil。

Objective-C里的NULL(空)就这么写,表示空指针。

四、类

1.类是Objective-C用来封装数据,以及操作数据的行为的基础结构。对象就是类的运行期间实例,它包含了类声明的实例变量自己的内存拷贝,以及类成员的指针。Objective-C的类规格说明包含了两个部分:接口和实现。接口部分包含了类声明和实例变量的定义,以及类相关的方法。实现部分包含了类方法的实际代码,类声明总是由@interface编译选项开始,由@end编译选项结束。类名之后的(用冒号分隔的)是父类的名字。类的实例(或者成员)变量声明在被大括号包含的代码块中。实例变量块后面就是类声明的方法的列表。每个实例变量和方法声明都以分号结尾。

2.类实现

类实现总是由@implementation开始,由@end编译选项结束。

+(MyClass*)createMyClassWithString: (NSString *) aName

3. Objective-C中的类可以声明两种类型的方法:实例方法和类方法。

类方法:-(id)initWithString:(NSString*) aName

实例方法就是一个方法,它在类的一个具体实例的范围内执行。也就是说,在你调用一个实例方法前,你必须首先创建类的一个实例。而类方法,比较起来,也就是说,不需要你创建一个实例。

方法实际的名字包含了冒号,冒号表明了参数的出现。

[myArrayinsertObject:anObj atIndex:0];

接收消息的对象在左边,消息(包括消息需要的任何参数)在右边。

[[myAppObjectgetArray] insertObject:[myAppObject getObjectToInsert] atIndex:0];

消息的嵌套

NSMutableArray*myArray = nil; // nil is essentially the same as NULL

//Create a new array and assign it to the myArray variable.

myArray= [NSMutableArray arrayWithCapacity:0];

4.类方法属性

属性是用来代替声明存取方法的便捷方式。属性不会在你的类声明中创建一个新的实例变量。他们仅仅是定义方法访问已有的实例变量的速记方式而已。

实际上可以说,属性节约了你必须要些的大量多余的代码。因为大多数存取方法都是用类似的方式实现的,你用属性声明指定你希望的行为,然后在编译期间合成基于声明的实际的getter和setter方法。

属性声明应该放在类接口的方法声明那里。基本的定义使用@property编译选项,紧跟着类型信息和属性的名字。你还可以用定制选项对属性进行配置,这决定了存取方法的行为。下面的例子展示了一些简单的属性声明:

@propertyBOOL flag;

@property(copy) NSString* nameObject; // Copy the object during assignment.

@property(readonly) UIView* rootView; // Create only a getter method.

property是一种代码生成机制,能够生成不同类型的getter/setter函数,特别是如果你想要用点(.)操作符号来存取变量的话,你就能必须使用property。

@s

用法如:@property (attribute1,attribute2) float value;

这些attribute包括:

readonly-只读,只能读取而不能设定值(不能用setXXXX的函式)。

readwrite-可读可写(默认)。

assign-在设值时替换新旧变量(默认)。

retain-在设值时retain新的变量,release旧变量。

copy-在设值时copy一份新变量,release旧变量。

nonatomic-默认為atomic。

前两个只是简单的设定变量的可读写性。

assign只是简单的替换变量,通常运用在标量类型上,例如:NSInterger和CGRect,

或者(在引用计数环境)为那些你不拥有的对象,例如:delegates。

在垃圾收集环境下retain 和 assign实际上是相同的。它的产生的setter代码內容类似:retain通常用在对象类型上,使用retain会通知编译器对新的变量发送保留(retain)的信息,以确保变量在程序支行时不会从记忆体中被清除。

copy也是通常用在必须是已经实现NSCopying协议的对象类型上,只是把刚刚retain的地方改成copy,在设定时不retain新的变量,而是copy一份給原变量成員。通常在新变量為mutable而原变量為immutable时使用,使用copy可以确保原变量仍是immutable。

变量和属性是不同的,属性是建立在变量的基础上的,但是实际上它是方法。

把slef.teststring_B = foo; 转化成[selfsetTeststring_B:foo]。

property实现的指令有两个:@synthesize和@dynamic

@synthesize自动生成setter&gettter方法,但也是允许覆盖的.

当你想要让getter或setter做更多的事情或加入新的特性时,就要用@dynamic,这时再用原来的@synthesize覆盖的话,会有警告,然后运行时如果你想用到新加入的特性时,运行会出错,使用@dynamic关键字来告诉编译器,你将通过属性暗示或者直接用方法实现或在运行时使用诸如代码动态加载或其动态方法解析机制来履行此API的约定。它会抑制编译器在不能找到合适的实现时生成的警告。当您知道该方法将在运行时可用时,就可以使用它。

nonatomic,刚是与多线程有关。默认为atomic是在multi-thread的环境下才会用到。在一般iPhone开发上,会设定为nonatomic来提高效率。atomic的意思就是setter/getter这个函数是一个原语操作。如果有多个线程同时调用setter的话,不会出现某一个线程执行setter全部语句之前,另一个线程开始执行setter情况,相当于函数头尾加了锁一样。nonatomic不保证setter/getter的原语行,所以你可能会取到不完整的东西。比如setter函数里面改变两个成员变量,如果你用nonatomic的话,getter可能会取到只更改了其中一个变量时候的状态,这样取到的东西会有问题。还有一点非常要注意的就是,在使用property时一定要在前面带上self(如:self.xxx),如果你不这样做,容易造成内存泄漏。

五、协议和代理

协议声明了可以被任何类实现的方法。他们仅是定义一个接口,其他的对象去负责实现。你实现了协议里面的方法,就叫做符合协议。在iPhone OS中协议常用来实现委托对象。委托对象就是一个对象以其他的对象的模式行事。UIApplication类实现了一个程序需要的行为。协议的声明跟类接口的声明很像,只是协议没有父类,而且他们不会定义任何实例变量。有一个方法的协议声明:

@protocolMyProtocol

-(void)myProtocolMethod;

@end

六、成员变量

1.成员变量的命名规范

 成员变量都以下划线 _ 开头

 可以跟get方法的名称区分开

 可以跟其他局部变量区分开,一看到下划线开头的变量,肯定是成员变量

2.set方法

1) 作用:用来设置成员变量,可以在方法里面过滤掉一些不合理的值

2) 命名规范:

 方法都是以set开头,而且后面跟上成员变量名,成员变量名的首字母必须大写

 形参名称不要跟成员变量同名

3.get方法

1) 作用:返回对象内部的成员变量

2) 命名规范:get方法的名称一般就跟成员变量同名

4.代码示例

#import<Foundation/Foundation.h>

//声明

@interfaceCar : NSObject

{

int_wheels;// 轮子个数

}

/*set方法*/

-(void) setWheels:(int)wheels;

/*get方法*/

-(int) wheels;

@end

@implementationCar

//set方法的实现

-(void) setWheels:(int)wheels

{

//对外面传进来的轮子数进行过滤

if(wheels<=0)

{

wheels= 1;

}

_wheels= wheels;

}

//get方法的实现

-(int) wheels

{

return_wheels;

}

@end

七、类方法

1.基本概念

直接可以用类名来执行的方法(类本身会在内存中占据存储空间,里面有类对象方法列表)

2.类方法和对象方法对比

1) 对象方法

 以减号-开头

 只能让对象调用,没有对象,这个方法根本不可能被执行

 对象方法能访问实例变量(成员变量)

2) 类方法

 以加号+开头

 只能用类名调用,对象不能调用

 类方法中不能访问实例变量(成员变量)

 使用场合:当不需要访问成员变量的时候,尽量用类方法

3) 类方法和对象方法可以同名

----------------------ASP.Net+Unity开发.Net培训、期待与您交流!
----------------------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: