`

OC基础语法学习笔记 总结

 
阅读更多
Objective-C语法:
一:对象声明语法:类名 * 对象名 = [[类名 alloc] init]
   [对象名 release] //释放对象的实例
   注:alloc是NSObject的类方法,init是实现类的初始化方法
二:类
   @interface MyClass:NSObject //接口
   {
      int count;
      id data;
      NSString * name;//变量
   }
   - (NSString *) getName;//方法
   - (void)setName:(NSString *)name
   + (float)classMethod:(float *)Method1 keyword:(int) Method2
   @end
   @implementation MyClass //实现
   - (NSString)getName
   {
      return @"";
   }
   @end
三:方法
声明:
+/-(返回类型)方法名:(参数类型1)参数名1 参数说明关键字:(参数类型2)参数名2 (...)...

- 类实例的方法
1-[self 方法名]
2-MyClass * myclass = [[MyClass alloc] init];
  [myclass setName:@"name"];
+ 类的方法
  [MyClass classMethod:12.5 keyword:1]

Objective-C基础语法:
1--文件类型
.h 头文件:类,类型,方法,结构体等声明
.m 实现文件:OC 和 C的代码
.mm 实现文件:C++和OC的代码
#import 确保头文件不被重复引用
2--字符串
@"string";
%d 十进制整数
%f 十进制小数(浮点型)
%c 字符
%s 字符串
%@ OC字符串
3--日志打印
printf("log message");
NSLog(@"log message");
4--数据类型和表达式
C语言基本数据类型:int float double char
其它数据类型:Long Longlong Short Unsigned(无符号型0--255) signed(有符号类型-128--127)
OC数据类型:
id 标识任何类的对象
BOOL boolean(YES/NO)
NIL NULL
SEL
SEL oneMethod=@selector(render);//@selector 得到一个方法的指针
[oneObject performSelector:oneMethod]
// 传入名为render的方法,使得oneMethod成为指向render方法的指针,oneObject是实例化的对象
// 通过呼出performselector来执行render方法。performSelector是NSObject类的实现方法。
YES
NO
5--循环
for(n=1;n<11;n=n+1){}
while(n <= 5){}
do{}while(n != 1)
6--条件
if(){}else{};
switch(){case ...}
XX?SS:CC
7--内存管理(计数器半自动化管理)
alloc +1
release -1
copy 1 重新生成一个新的实例
retain +1
autorelease 再pool栈顶添加此对象
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

[pool drain]
8--继承
@interface subClassName:superClassName
-(BOOL)isKindOfClass:class-object // 判断对象是否是某一种类的实例(包括其父类)
-(BOOL)isMenberOFClass:class-object // 判断对象是否是某一种类的实例(不包括其父类)
-(BOOL)respondsToSelector:select // 判断对象是否实现某个方法
+(BOOL)instancesRespondToSelector:selector //判断类的实例是否实现某个方法
+(BOOL)isSubclassOfClass:class-object //判断一个类是否是某个类的子类
-(id)performSelector:selector // 让对象呼叫指定的方法
-(id)performSelector:selector withObject:object // 让对象呼叫指定的方法并带有参数
A * a = [[A alloc] init];
if([a isKindOfClass:[A class]] == YES){}
9--类别和协议
类别:@interface myClass(类别名) 类别和继承类似,但类别只能添加新的方法不能添加任何实例变量
协议:类似于Java的interface
协议的声明:
@protocol protocolName
@optional // 默认实现的方法
-(void)method1
@required // 必须实现的方法
-(void)method2
@end
协议的使用:
@interface myClass:superClass<protocol1,protocol2, ...>
协议实现对象委托:
@protocol proA
-proMethod1;
-proMethod2;
@end

@interface myClassA:NSObject
{
// 代理变量
id _delegate;
}
// 代理方法
@property(nonatomic,retain) id _delegate;
-(void)callDelegateMethod;
@end
@implement myClassA
@synthesize -delegate;
-(void)callDelegateMehtod
{
[_delegate proMethod1];
[_delegate proMethod2];
}
@end

@interface myClassB:NSObject<proA>
-(void)testDelegate;
@end
@implement myClassB
// 协议(接口)方法实现
-(void)testDelegate
{
myClass * myA = [[myClass alloc] init];
// 设置代理
_delegate self;
[myA callDelegateMethod];
}
@end
10--属性
声明:@property (修饰) 类型 属性名
@property(nonatomic,retain) id _delegate;
实现:@synthesize 属性名
@synthesize -delegate;
修饰的类型:
readwrite: 变量可读写
readonly: 变量只可以读,需要手动添加setter
assign: 变量可以直接赋值,内存引用计数值不变
retain: 对象进行一次引用,内存引用计数值+1
copy: 复制一个新的对象,内存引用计数值为1
nonatomic: 默认为atomic 在多线程是变量互斥
11-快速枚举
NSArray * array = [NSArray arrayWithObjects:@"ome",@"two",@"three",nil];
NSDictionary
NSManagedObjectModel
NSSet
----------------------------------
for(NSString * element in array){}
----------------------------------
NSEnumerator * enu = [array reverseObjectEnumerator];
for(NSString * element =[enu nextObject])
{
if([element isEqualToString:@"three"])
{
break;
}
}
---------------------------------


OS中OC是很重要的语言,通过看《Objective C Programming》,能让我对OC有个大概的了解。为了加深印象,特于此加以总结。

OC是源于SmallTalk的,起源甚至比C++还早。其直接父系语言为C语言。
OC通过@interface-@end以及@implementation-@end来实现类声明和定义。
OC中类一般至少继承与Object类
OC中所有的类对象必须动态申请,也就是说没有局部变量这么一说。
OC中类没有所谓的构造函数和析构函数,所以如果一个类中有其他类的数据(动态申请的),那么释放内存就不能依赖析构函数,但可以采用重写-(id) free来实现类中所有数据释放。
OC中成员变量也有三种访问权限,@public,@protected,@private。但默认的是@protected,而C++中默认是private。
OC中成员函数只有两种,一种是实例函数,一种是类函数。实例函数就是C++中的Public函数,类函数就是public中的static函数。
OC中成员函数如果要接受多个参数,则需要每个参数前加冒号(虽然教科书上说参数后加冒号,但就我看来说成参数前加更能让C++Programmer理解)。例如-( int ) Set : ( int ) A : ( int ) B ;每个形参前还可以加一个参数名,并成为函数名的一部分。例如-( int ) Set : ( int ) A  And :  ( int ) B;在使用时[ classTest Set : 10 And : 12 ]; 起初看起来确实不习惯。。。
OC中还多了一个id类型,通过测试,id就是指针。32位机器上为4字节。
OC中多了很多运行时态的机制,其中id的特殊用途,可以通过id类型的变量,调用不同类的同名函数,即使这些类没有任何关系。
OC可以给已类添加新的函数。@interface classExist( NewMethodGroup )-@end,@implementation classExist( NewMethodGroup )-@end。
OC可以将让某类A,代替某类B。通过poseAs关键字。例如:[FractionB poseAs: [Fraction class]];此后使用Fraction类时,就转换成使用FractionB了。
OC还有protocol概念。protocol实际是一组函数,支持改协议的类都应重写这些函数。通过@protocol-@end来声明protocol。类中通过<protocol1,protocol2,...>来表示支持某个协议。如@interface A : Object < NSCopying, NSTransform >-@end表明类A继承与Object类,并支持两个协议(NSCopying, NSTransform )。

OC最后总结,其类实现以c为基础。@interface classTest - @end是相当于一组宏,帮你将类的所有成员变量声明组织为一个结构体,成员函数实际就是普通函数,是在原来成员函数基础上,修改函数名称,添加结构体指针到第一个参数。id类型实际也就是指针。难怪OC的类看起来不像C的一般语法,原因就是其源自C的一般语法,采用新的类脚本的方式,实现的类功能。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics