1.
IOS中类声明的文件叫做接口文件,以.h命名。
2.
类定义的文件叫做实现文件,以.m命名。
3.
#import是文件包含的内容。
4.声明对象
类名 *对象名
* 表示对象是对类的一个引用
5.为对象分配空间
对象名=[类名 alloc]
alloc消息是定义在类方法中的
6.为对象进行初始化
对象名=[对象名 init]
init消息是定义在类方法中的
7.实例化对象
类名 *对象名=[[类名 alloc] init]
8.实例化对象
类名 *对象名=[类名 new]
9.减号
减号表示一个函数、或者方法、或者消息的开始
10.
加号表示其他函数可以直接调用这个类中的这个函数,而不用创建这个类的实例
11.Java与OC方法对比
Java中的一个方法的代码如下
public void test(bool flag)
{
}
若使用Objective-C则代码如下
-( void ) test:( bool )flag
{
}
12.中括号
[]代表方法的调用
Java中如下代码
this.test(true);
若使用Objective-C则代码如下
[self test: YES ];
13.NS***
在 Mac OS 中 NextStep 是一套函数库,函数库的开发人员将函数库里面所有的类都用 NextStep 的缩写打头命名,也就是 NS*
如:NSString、NSObject、NSLog
14.类的声明
#import <Foundation/Foundation.h>
@interface Test : NSObject
{
}
@end
在Xcode环境中,声明出来的类都有一个父类,NSObject父类是系统自动加上的,开发过程中可以根据实际情况修改
15.类的定义
#import "Test.h"
@implementation Test
@end
类名需要和类声明中的保持一致
16.一个方法传递多个参数
Java中如下代码
public void setParamsValue( string param1, string param2, string param3)
{
}
若使用Objective-C则代码如下
-( void ) setParamsValue: (NSString *)param1 mySecondVar: ( NSString *) param2 myThirdVar: (NSString *) param3 {
}
17.带参数的方法的调用
Java中如下代码
Test test = new Test();
test.setParamsValue(“a”, “b”, “ c” );
若使用Objective-C则代码如下
Test *test = [[Test alloc] init ];
[test setParamsValue: @”a” mySecondVar: @”b” myThirdVar: @”c”];
18.动态类型id
在OC中,id类型是一个独特的数据类型,可以转换为任何数据类型。
使用id类型定义变量如下所示:
id 变量名;
返回id类型的方法定义如下所示,当然方法可以为有参的或无参的:
-(id) 方法名;
它表示任意的数据类型。
在OC中,一切东西都是指针形式保存,你获取到的就是这个对象在内存的位置。id 就是你知道这个位置,但是不知道里面是啥的时候的写法。
19.NSArray
同一个数组可以保存不同类型的对象
20.YES NO
Java中的true false
对应着OC中的YES NO ,其值YES 是1 NO是0
21.nil
Java中的NULL
对应着OC中的nil,即空指针
22.@”字符串”而不是”字符串”
”字符串”是C的字符串,@”"是把C的字符串转成NSString的
@这个转换是不支持中文的
23. 文件包含中的尖括号与双引号的使用区别
#import <Foundation/Foundation.h> 使用尖括号,导入的文件是系统文件
#import "Test.h" 使用双引号,导入的是本地自定义文件
24.实例变量的定义
实例变量即在类中定义的变量,可以在各个方法中使用。
实例变量需要在类声明文件即***.h中定义,如:
#import <Foundation/Foundation.h>
@interface Test : NSObject
{
int a;
}
@end
25.实例变量的使用
#import <Foundation/Foundation.h>
#import "Test.h"
int main(int argc,const char * argv[])
{
Test *test=[[Test alloc] init];
test->a=1;
NSLog(@"a=%i", test->a);
}
26.extern声明变量
外部变量是在方法的外部定义的全局变量,作用域是从变量的定义处开始到程序执行结束。变量的使用必须是先定义后使用,若想实现在外部变量定义之前使用该外部变量,则需要使用extern对外部变量进行声明。
int main(int argc,const char * argv[])
{
extern m;
NSLog(@"m=%i", m);
}
int m=1;
27.auto
方法内部变量的默认声明方式
28.const
将变量的值声明为不可变的值即为常数
29.volatile
用来修饰在不同线程中需要进行访问或修改的变量
30.方法的声明
方法声明,是在类声明文件即***.h中的
#import <Foundation/Foundation.h>
@interface Test : NSObject
{
int a;
}
-/+(方法的返回值类型) 方法名;
@end
其中,-代表是对象方法,+代表是类方法
31.方法的定义
#import "Test.h"
@implementation Test
-/+(方法的返回值类型) 方法名
{
//具体实现逻辑
}
@end
32.对象方法的使用
[对象名 方法名]
在对象方法使用时必须加上方括号[]
33.类方法的使用
类方法,无需创建类的实例对象就可以直接使用
[类名 方法名]
34.单个参数方法的声明
-/+(方法的返回值类型) 方法名:(参数类型) 参数名;
方法的返回值类型、参数类型必须使用括号括起来
35.单个参数方法的使用
[对象名 方法名:参数] 对象方法的使用
[类名 方法名:参数] 类方法的使用
36.属性
属性专指@property修饰过的成员变量,作用在于类以外的代码访问时,可以通过属性来访问内部变量,而不能直接访问类的成员。
37.属性声明
@property 类型 实例变量名称
相当于Java中对成员变量生成get和set方法
#import <Foundation/Foundation.h>
@interface Test : NSObject
{
int a;
}
@property int a;
-(void) print;
@end
38.属性定义
@synthesize 实例变量名称
#import "Test.h"
@implementation Test
@synthesize a;
-/+(void) print
{
NSLog(@"%i",a);
}
@end
#import <Foundation/Foundation.h>
#import "Test.h"
int main(int argc,const char * argv[])
{
Test *test=[[Test alloc] init];
[test setA:1];
[test print]
return 0;
}
39.带参属性
属性声明时是可以带参数的,参数要使用括号括起来
@property (参数) 类型 实例变量名称
40.setter设置器
设置实例变量的值
-(void)set+实例变量名:(参数类型) 参数名;
其中,实例变量名的第一个单词的首字母要大写
41.getter访问器
获取实例变量
-(返回值类型)实例变量名;
42.setter设置器 getter访问器 的调用
[对象名 set+实例变量名:数值] setter设置器的调用
[对象名 实例变量名] getter访问器的调用
对象名.实例变量名=数值; 类似于setter设置器的调用
对象名.实例变量名; 类似于getter访问器的调用
43.带参属性(读写属性)
@property(readonly) int a;
readonly:只读,编译器不会生成setter方法
@property(readwrite) int a;
readwrite:读写,可以获取并设置实例变量的值
44.带参属性(原子访问)
@property(atomic) int a;
在默认情况下,属性是原子访问的,默认通过synthesized实现的setter和getter都是原子访问的。
@property(nonatomic) int a;
非原子访问
45.带参属性(多个特性一起使用)
@property(特性1,特性2,...) 类型 实例变量名;
46.继承
:用来实现继承,在OC中默认的父类名是NSObject
在子类的声明文件即***.h中,若继承了自定义父类,要将父类的类声明文件即父类的头文件***.h包含进来
47.实例变量访问限定符@public
@public:作用域不受限制,即共用的数据成员
@public 数据类型 实例变量名;
48.实例变量访问限定符@protected
@protected:保护数据成员,它可以使得实例变量只可以在所属的类及其子类定义的方法中被直接访问。若实例变量没有被任何访问限定符修饰,则默认使用的是@protected
@protected 数据类型 实例变量名;
49.实例变量访问限定符@private
@private:私有数据成员,只可以在所属类的方法中调用
@private 数据类型 实例变量名;
50.方法重写(方法覆盖)
当子类和父类中的某一个方法具有相同的方法名、返回值类型、参数,那么子类的方法就覆盖了父类中的方法。在子类的头文件中,需要对这个覆盖方法进行方法声明,在子类的类定义文件.m中进行逻辑代码实现。
51.super
super关键字代表父类,使用它可以访问被子类所隐藏或者重写的父类方法。
super和方法名必须要用方括号括起来
[super 方法名];
52.方法重载
在类中可以创建多个相同名字的方法,但是这些同名的方法具有不同的参数数据类型或参数个数。
在调用时只要通过传递的参数个数和类型的不同,就可以区分具体调用的是哪个重载方法。
53.多态
多态:相同的消息给予不同的对象会引发不同的动作。
多态分为编译时多态(覆盖、重载)、运行时多态。
54.动态绑定
动态绑定是指在执行期间(非编译器)判断所引用对象的实际类型,根据其实际的类型调用其相应的方法。动态绑定的实现是离不开动态类型id的。
TestOne.h
#import <Foundation/Foundation.h>
@interface TestOne : NSObject
{
NSString *a;
}
-(void) setA;
-(void) print;
@end
TestOne.m
#import "TestOne.h"
@implementation TestOne
-(void) setA
{
a=@"TestOne";
}
-/+(void) print
{
NSLog(@"%@",a);
}
@end
TestTwo.h
#import <Foundation/Foundation.h>
@interface TestTwo : NSObject
{
NSString *a;
}
-(void) setA;
-(void) print;
@end
TestTwo.m
#import "TestTwo.h"
@implementation TestTwo
-(void) setA
{
a=@"TestTwo";
}
-/+(void) print
{
NSLog(@"%@",a);
}
@end
main.m
#import <Foundation/Foundation.h>
#import "TestOne.h"
#import "TestTwo.h"
int main(int argc,const char * argv[])
{
id abc;
TestOne *testOne=[[TestOne alloc] init];
abc=testOne;
[abc setA];
[abc print];
TestTwo *testTwo=[[TestTwo alloc] init];
abc=testTwo;
[abc setA];
[abc print];
return 0;
}
执行后的输入结果如下:
TestOne
TestTwo
资源推荐:CocoaChina.com
国内第一个也是最大的一个苹果相关产品的中文开发社区网站,网站前身是一个科技博客网站,经过发展积累,逐渐成为苹果电脑及iPhone手机开发的专业网站。网站目前提供各种苹果相关的开发内容,CocoaChina论坛也是国内最大的苹果电脑开发及iPhone开发论坛。