Objective-C文件结构
2015-11-09 16:49
615 查看
1.头文件/接口文件
创建类时将创建两个文件:头文件/接口文件,及实现文件。头文件.h后缀,实现文件.m后缀。头文件/接口文件用于定义可供其他类使用的所有方法和属性。
编译指令#import and @import
eg:
#import <UIKit/UIKit.h>
该接口文件使用编译指令#import包含应用程序需要访问的其他接口文件
模块导入语法为:@import<module name>;
eg:
@import UIKit;
动态地导入模块可提高应用程序的变异速度,还将根据需要自动将核实的框架连接到应用程序中。
编译指令@interface 和实例变量
使用编译指令@interface定义一个类,其中位于花括号{}内的代码定义了该类将提供的所有实例变量。
@interface myClass:myParent <myProtocol>{
NSSTring *_myString;
IBOutlet UILabel *_myLabel;
};
实例变量名一下划线"_"打头,给实例变量命名时,可以不一下划线打头,但使用Xcode代码生成工具时,他们将遵守这种命名约定。在大部分开发工作中,都不需要创建实例变量,而通过定义属性来隐式地创建实例变量。所有的实例变量声明,方法声明,模块导入和属性声明都必须以";"结尾。
类名:myClass :后跟随其继承的父类:myParent.<>内的为协议列表。
类的接口文件和实现文件的名称通常与类名相同。在这里,接口文件将名为myClass.h实现文件将名为myclass.m
协议是Objective-C特有的一种功能。
编译指令@property和实例变量
eg:
@property (weak,nonatomic) NSString *myString;
@property (weak,nonatomic) NSString *myOtherString;
编译指令@property用于简化您与接口中定义的实例变量的交互方式;与实例变量存储的对象交互,必须使用获取函数和设置函数的方法;这些方法创建用于获取或设置实例变量的值,而不用触及变量本身。@property和@synthesize的作用是编写设置函数和获取函数。
要设置实例变量_myString可使用如下代码:
[myClassObject setMyString:@"Hello World"];
要获取_myString的值,可使用下面的代码:
theStringInMyObject=[myClassObject myString];
通过使用@property和synthesize可这样读写实例变量的值:输入包含该属性的对象的名称,句点,和属性名。如下所示:
myClassObject.myString=@"Hello World";
theStringInMyObject=myClassObject.myString;
Objective-C允许通过声明属性来隐式地声明实例变量。
@property (weak,nonatomic) NSString *myOtherString;
上述代码声明了一个名为myOtherString的实例变量,以及与之相关联的属性。
@property (weak,nonatomic) IBOutlet UILabel *myOtherLabel;
上述代码声明属性同时创建属性,实例变量和输出口。
属性名与实例变量名之间的关系:
实例变量名通常以下划线_打头,属性名并非如此。属性名不以下划线打头,但引用以下划线打头的实例变量名。如声明了实例变量:myVariable.并创建一个引用他的属性,则不能将该属性命名为myVariable。可以通过编译指令@property来创建属性和相应的实例变量。
在编译指令@property中指定的特性(weak,nonatomic)告诉Xcode如何处理属性引用的对象。特性weak告诉系统不再使用引用的对象时,可以将其从内存中删除。nonatomic告诉Xcode不用担心应用程序的不同部分同时使用该属性的问题。几乎在任何情况下,都将使用这两个特性。有时候用strong代替weak,strong引用意味着对象将一直驻留在内存中,知道程序猿显式地让系统将其从内存中清除。
如何引用变量和属性?
1. 要访问实例变量,只需使用期名称。如实例变量_myVariable,则在任何地方都可使用_myVariable来直接访问它。
2.要访问对象的属性,必须使用<objectname>.<propertyname>。如myAmazingObject包含属性myProperty,必须使用myAmazingObject.myProperty来访问它。在类中访问它定义的属性可使用self.<propertyname>。若仅使用属性名,Xcode将认为您要访问一个实例变量,进而触发错误。
定义方法:
接口文件的最后一部分是方法定义:--原型
+(NSString)myClassMethod:(NSString *)aString;
-(NSDate)myInstanceMethod:(NSString *)aString anotherParam:(NSURL *)aURL;
-(IBAction)myActionMethod:(id)sender;
原型采用一种简单的结构。他们以"+","-"打头,+表示类方法,-表示实例方法。
实现文件:
实现文件扩展名为.m包含让类能够工作的所有代码,还包括私有属性,实例变量和方法的定义。
私有变量,属性和方法
上述代码中一个@interface块包含一个一个属性声明。我们可以将实例变量,属性,输出口和方法定义放在这里,而且它们将是私有的。(Xcode5之后都在实现文件中定义输出口和操作)
@implementation myClass通过编译指令@implementation告诉Xcode该文件实现myClass类。
方法实现:
未提供编写代码的区域,必须在实现文件中再次声明方法 的第一 。上述代码中三个方法分别是类方法,公有实例方法和私有方法,它们的代码都在实现文件中提供的。对于在接口文件中声明的公有实体以及在实现文件开头声明的私有实体,都必须在实现文件中实现它们。
分类和协议
除编写类外,还可使用Objective-C分类和协议来定义功能。分类让您能够给现有的类添加方法,而无需派生子类或重写现有的方法。意味着可以给NSString内置类添加新方法。
协议不实现功能,而定义了遵守协议的类可能或必须实现的功能。可以定义个协议,让其能够与您编写的代码交互。这种交互通常是使用UITable对象实现的,这些对象要求编写向他们提供数据的方法。协议类似于Java中的接口。
1.定义分类:
要定义分类,首先决定它要给哪个类添加方法,并根据提供的功能确定其名称,再次采用下述格式新建一个接口文件:
@interface ClassNameToUpdate(CategoryName)
//
@end
再采用如下格式新建一个实现文件:
@implementation ClassNameToUpdate (CategoryName)
//
@end
分类文件遵循如下命名约定:要更新的类的名称,加好(+)和分类名称
eg:
ClassNameToUpdate+CategoryName.h 和ClassNameToUpdate+CategoryName.m
创建分类后要在其他类中使用它,只需导入期接口文件。可使用分类重写原有方法,但不能添加新的实例变量或属性。
2.创建协议:
创建协议比创建类或分类更容易,因为只需定义要在其他地方定义的功能。要定义新协议可新建一个接口文件,并使用协议给文件命名。该文件的内容采用如下格式
@protocol ANewProtocol <NSObject>
@optional
///
@required
///////////////////
@end
<NSObject>为当前协议基于的基协议,这类似与从类继承。编译指令@required用于指定为遵守该协议必须实现的方法,而编译指令@optional用于指定可选的方法。当未指定@required或@optional时方法默认为必需的。
Objective编程基础
1.基本数据类型:
int:整数
float:浮点数
double:高精度的浮点数
2.分配和初始化对象:
通过向要是用的类发送alloc消息,在向alloc返回的对象发送init消息完成。Objective-C使用传统语法如下:
[ [<calss name> alloc] init];
可使用new简化这种语法如下:
[<class name> new];
eg:声明并创建UILabel类的一个实例,使用如下代码:
UILable *myLabel;
myLabel = [UILabel new];
分配并初始化对象后,便可使用它了。
3.使用方法及发送消息:
消息发送语法
要给对象发送消息,可指定引用该对象的变量的名称以及方法名,并将他们都放在方括号内。如果要使用类方法则需指定类名而不是变量名。
[<object variable or class name> <method name>];
当方法有参数时,调用接收一个参数的方法时,其语法类似于下面:
[<object variable> <method name>:<parameter value>];
接受多个参数的方法的调用语法看起来更怪异
[<object variable> <method name>:<parameter value>additionalParameter:<parameter value>];
eg:
[userName compare:@"John" options:NSCaseInsensitive];
其中对象userName使用方法compare:options将其自身与字符串John进行比较,方法返回一个bool值。
通过名称来饮用方法,若名称中包含冒号:则表明方法有必须提供的参数。在Objective-C中一个很有用的预定义值是nil。nil表示根本就没有值。调用有些方法时,如果不知道其参数值,将使用nil.对于需要接收对象作为参数的方法,如果将该参数设置为nil,实际上可能将把消息发送给nil,而不会导致任何错误--nil将另一个nil作为结果返回。
创建类时将创建两个文件:头文件/接口文件,及实现文件。头文件.h后缀,实现文件.m后缀。头文件/接口文件用于定义可供其他类使用的所有方法和属性。
编译指令#import and @import
eg:
#import <UIKit/UIKit.h>
该接口文件使用编译指令#import包含应用程序需要访问的其他接口文件
模块导入语法为:@import<module name>;
eg:
@import UIKit;
动态地导入模块可提高应用程序的变异速度,还将根据需要自动将核实的框架连接到应用程序中。
编译指令@interface 和实例变量
使用编译指令@interface定义一个类,其中位于花括号{}内的代码定义了该类将提供的所有实例变量。
@interface myClass:myParent <myProtocol>{
NSSTring *_myString;
IBOutlet UILabel *_myLabel;
};
实例变量名一下划线"_"打头,给实例变量命名时,可以不一下划线打头,但使用Xcode代码生成工具时,他们将遵守这种命名约定。在大部分开发工作中,都不需要创建实例变量,而通过定义属性来隐式地创建实例变量。所有的实例变量声明,方法声明,模块导入和属性声明都必须以";"结尾。
类名:myClass :后跟随其继承的父类:myParent.<>内的为协议列表。
类的接口文件和实现文件的名称通常与类名相同。在这里,接口文件将名为myClass.h实现文件将名为myclass.m
协议是Objective-C特有的一种功能。
编译指令@property和实例变量
eg:
@property (weak,nonatomic) NSString *myString;
@property (weak,nonatomic) NSString *myOtherString;
编译指令@property用于简化您与接口中定义的实例变量的交互方式;与实例变量存储的对象交互,必须使用获取函数和设置函数的方法;这些方法创建用于获取或设置实例变量的值,而不用触及变量本身。@property和@synthesize的作用是编写设置函数和获取函数。
要设置实例变量_myString可使用如下代码:
[myClassObject setMyString:@"Hello World"];
要获取_myString的值,可使用下面的代码:
theStringInMyObject=[myClassObject myString];
通过使用@property和synthesize可这样读写实例变量的值:输入包含该属性的对象的名称,句点,和属性名。如下所示:
myClassObject.myString=@"Hello World";
theStringInMyObject=myClassObject.myString;
Objective-C允许通过声明属性来隐式地声明实例变量。
@property (weak,nonatomic) NSString *myOtherString;
上述代码声明了一个名为myOtherString的实例变量,以及与之相关联的属性。
@property (weak,nonatomic) IBOutlet UILabel *myOtherLabel;
上述代码声明属性同时创建属性,实例变量和输出口。
属性名与实例变量名之间的关系:
实例变量名通常以下划线_打头,属性名并非如此。属性名不以下划线打头,但引用以下划线打头的实例变量名。如声明了实例变量:myVariable.并创建一个引用他的属性,则不能将该属性命名为myVariable。可以通过编译指令@property来创建属性和相应的实例变量。
在编译指令@property中指定的特性(weak,nonatomic)告诉Xcode如何处理属性引用的对象。特性weak告诉系统不再使用引用的对象时,可以将其从内存中删除。nonatomic告诉Xcode不用担心应用程序的不同部分同时使用该属性的问题。几乎在任何情况下,都将使用这两个特性。有时候用strong代替weak,strong引用意味着对象将一直驻留在内存中,知道程序猿显式地让系统将其从内存中清除。
如何引用变量和属性?
1. 要访问实例变量,只需使用期名称。如实例变量_myVariable,则在任何地方都可使用_myVariable来直接访问它。
2.要访问对象的属性,必须使用<objectname>.<propertyname>。如myAmazingObject包含属性myProperty,必须使用myAmazingObject.myProperty来访问它。在类中访问它定义的属性可使用self.<propertyname>。若仅使用属性名,Xcode将认为您要访问一个实例变量,进而触发错误。
定义方法:
接口文件的最后一部分是方法定义:--原型
+(NSString)myClassMethod:(NSString *)aString;
-(NSDate)myInstanceMethod:(NSString *)aString anotherParam:(NSURL *)aURL;
-(IBAction)myActionMethod:(id)sender;
原型采用一种简单的结构。他们以"+","-"打头,+表示类方法,-表示实例方法。
实现文件:
实现文件扩展名为.m包含让类能够工作的所有代码,还包括私有属性,实例变量和方法的定义。
#import "myClass.h" @interface myClass(){ NSString *_myPrivateString; } @property (weak,nonatomic)IBOutlet UILabel *myPrivateLabel; -(IBAction)myPrivateActionMethod:(id)sender; @end @implementation myClass +(NSString)myClassMethod:(NSString *)aString{ // } -(NSString)myInstanceMethod:(NSString *)aString anotherParam:(NSURL *)aURL{ // } -(IBAction)myPrivateActionMethod:(id)sender{ // } @end编译指令以@import打头,导入与类相关的接口文件
私有变量,属性和方法
上述代码中一个@interface块包含一个一个属性声明。我们可以将实例变量,属性,输出口和方法定义放在这里,而且它们将是私有的。(Xcode5之后都在实现文件中定义输出口和操作)
@implementation myClass通过编译指令@implementation告诉Xcode该文件实现myClass类。
方法实现:
未提供编写代码的区域,必须在实现文件中再次声明方法 的第一 。上述代码中三个方法分别是类方法,公有实例方法和私有方法,它们的代码都在实现文件中提供的。对于在接口文件中声明的公有实体以及在实现文件开头声明的私有实体,都必须在实现文件中实现它们。
分类和协议
除编写类外,还可使用Objective-C分类和协议来定义功能。分类让您能够给现有的类添加方法,而无需派生子类或重写现有的方法。意味着可以给NSString内置类添加新方法。
协议不实现功能,而定义了遵守协议的类可能或必须实现的功能。可以定义个协议,让其能够与您编写的代码交互。这种交互通常是使用UITable对象实现的,这些对象要求编写向他们提供数据的方法。协议类似于Java中的接口。
1.定义分类:
要定义分类,首先决定它要给哪个类添加方法,并根据提供的功能确定其名称,再次采用下述格式新建一个接口文件:
@interface ClassNameToUpdate(CategoryName)
//
@end
再采用如下格式新建一个实现文件:
@implementation ClassNameToUpdate (CategoryName)
//
@end
分类文件遵循如下命名约定:要更新的类的名称,加好(+)和分类名称
eg:
ClassNameToUpdate+CategoryName.h 和ClassNameToUpdate+CategoryName.m
创建分类后要在其他类中使用它,只需导入期接口文件。可使用分类重写原有方法,但不能添加新的实例变量或属性。
2.创建协议:
创建协议比创建类或分类更容易,因为只需定义要在其他地方定义的功能。要定义新协议可新建一个接口文件,并使用协议给文件命名。该文件的内容采用如下格式
@protocol ANewProtocol <NSObject>
@optional
///
@required
///////////////////
@end
<NSObject>为当前协议基于的基协议,这类似与从类继承。编译指令@required用于指定为遵守该协议必须实现的方法,而编译指令@optional用于指定可选的方法。当未指定@required或@optional时方法默认为必需的。
Objective编程基础
1.基本数据类型:
int:整数
float:浮点数
double:高精度的浮点数
2.分配和初始化对象:
通过向要是用的类发送alloc消息,在向alloc返回的对象发送init消息完成。Objective-C使用传统语法如下:
[ [<calss name> alloc] init];
可使用new简化这种语法如下:
[<class name> new];
eg:声明并创建UILabel类的一个实例,使用如下代码:
UILable *myLabel;
myLabel = [UILabel new];
分配并初始化对象后,便可使用它了。
3.使用方法及发送消息:
消息发送语法
要给对象发送消息,可指定引用该对象的变量的名称以及方法名,并将他们都放在方括号内。如果要使用类方法则需指定类名而不是变量名。
[<object variable or class name> <method name>];
当方法有参数时,调用接收一个参数的方法时,其语法类似于下面:
[<object variable> <method name>:<parameter value>];
接受多个参数的方法的调用语法看起来更怪异
[<object variable> <method name>:<parameter value>additionalParameter:<parameter value>];
eg:
[userName compare:@"John" options:NSCaseInsensitive];
其中对象userName使用方法compare:options将其自身与字符串John进行比较,方法返回一个bool值。
通过名称来饮用方法,若名称中包含冒号:则表明方法有必须提供的参数。在Objective-C中一个很有用的预定义值是nil。nil表示根本就没有值。调用有些方法时,如果不知道其参数值,将使用nil.对于需要接收对象作为参数的方法,如果将该参数设置为nil,实际上可能将把消息发送给nil,而不会导致任何错误--nil将另一个nil作为结果返回。
相关文章推荐
- c++中的对象引用(object reference)与对象指针的区别
- 线程同步 等待函数 WaitForSingleObject WaitForMultipleObjects
- Object超类中Equals方法、toString方法和hashCode方法使用的举例
- Assigning retained object to weak property; object will be released after assignment
- swift object-c互用
- swift object-c互用
- <iOS>Objective-C对URL尽心URLEncode编码
- Android关于对象(Object)在activity间传递的变化研究
- 使用[NSKeyedUnarchiver unarchiveObjectWithData:data]程序crash
- 遍历可变数组的同时删除数组元素的几种解决方案
- 对象的拷贝
- 类Object中的equals()方法
- Objective-C语法之KVC使用
- GameObject.Find()和transform.Find()混合使用
- Objective-C对象模型及应用
- Objection 一个轻量级的Objective-C依赖注入框架
- Objection, 一个轻量级的Objective-C依赖注入框架
- - (void)insertObjects:(NSArray *)objects atIndexes:(NSIndexSet *)indexes使用方法
- ObjectiveC中打印Call Stack的若干方法
- objective-c系列-NSDictionary&NSMutableDictionary