OC语法总结

1、定义类:
@interface 类名 : 父类
@end

2、使用:(冒号)表示继承一个类
Student : NSObject

3、使用()定义一个Catagory(类别)

* 作用:在不改变原有类结构的基础上,扩展原有类的方法(不能扩展属性),但不建议重载原有类的方法

* 开发工具默认生成的文件为:类名+Catagory名称

* Catagory可以写在单独的文件中,也可以写在原有类的文件中,如何写根据需求来决定。

4、使用<>表示实现一个Protocol(协议),如需实现多个协议,将协议名以逗号分隔都写在括号中即可

*可以理解为java中的接口,但不同的是,实现类编译器不强制实现Protocol中定义的所有接口

* 在方法签名上标识:@required,从字面上理解实现类必须实现该方法,其实写与不写一样的效果。也是默认的

* 在方法签名上标识:@optional,表示实现类对该方法的实现,是可选的。

  
5、属性的访问权限

* private : 只有类内部可以访问

* protected : 类内部和子类可以访问(默认)

* public : 访问没有限制

例:

// 定义

@interface Student : NSObject {

@private int _age;

@protected int _no;

@public float _height;

}
@end

// 使用
Student *stu = [[[Student alloc]init]autorelease];
stu->_height = 20;// 直接读写属性的值,开发当中一般不建议这么做。违背了面向对象的开发原则-》封装性

6、属性的定义与封装
// in Student.h
@interface Student : NSObject {

// 1. 定义属性,默认访问权限是@protected的,只有自已和子类可以直接访问

int _age;// OC语法中建议属性名前面加上下划线,以和参数名区分

int _no;

}

// 2.提供属性对外读写方法的声明,供外界调用。OC创建属性读写方法的命名规则是为,set方法: set+属性名,get方法:属性名
// 声明age的get和set方法
- (int)age;
- (void)setAge:(int)age;

// 声明no的get和set方法
- (int)no;
- (void)setNo:(int)no;
@end

// in Student.m 实现头文件中的方法
#import "Student.h"// 导入头文件
@implementation Student

// 实现头文件中的方法
- (int)age {
 // age的getter方法

return _age;

}

- (void)setAge:(int)age {// age的setter方法

_age = age;

}

- (int)no {

return _no;

}

- (void)setNo:(int)no {

_no = no;

}
@end

7、使用@synthesize自动生成属性getter和setter方法的实现,同时会生成一个下划线(_)+属性名的成员变量。需要和@property配合使用。例:
@implementation Student

@synthesize age;// 这一句顶下面的get和set方法,由@synthesize自动生成
/*
* 1. 如果显示实现了get方法,@synthesize会自动生成属性的set方法实现
* 2. 如果显示实现了set方法,@synthesize会自动生成属性的get方法实现
* 3. 如果即没有实现get方法,也没有实现set方法,则@synthesize会自动生成属性的get和set方法实现
*/
- (int)age {
 // age的getter方法

return _age;

}

- (void)setAge:(int)age {// age的setter方法

_age = age;

}

@end

注:在xcode4.5以后的编译环境中,不需要写@synthesize声明生成属性的get和set方法实现。只需要在头文件中用@property定义即可自动在.m文件中生成相应属性的get和set方法实现

8、使用@property声明一个属性,编译器会自动生成该属性的getter和setter方法的声明

在xcode4.5以后版本的编译器环境中,会自动在.m文件中生成该属性getter和setter方法的标准实现,不需显示声明用@synthesize来生成属性的getter和setter方法实现。

9、@property属性参数
1> nonatomic : 多线程环境下,不需要线程保护(读写时不加锁), 
  atomic : (默认)多线程环境下需要线程保护(读写时加锁).
2> readonly : 表示在.m文件中只生成属性的getter方法的实现
  readwriter : 表示在.m文件中生成属性的getter和setter方法的实现(默认)
3> retain : 表示调用该属性的setter方法时,先release旧的值,再retain新的值。一般声明的成员变量是NSObject的子类才会添加该参数
  assign : 生成标准的getter和setter方法实现(默认),直接给属性赋值
4> getter= : 表示自定义属性生成的getter方法名称
  setter= : 表示自定义属性生成的setter方法名称

10、方法调用
* [实例对象 方法名:参数列表]
* [类名 方法名:参数列表]
例:
Student *stu = [[[Student alloc]init]autorelease];
[stu setAge:22 andNo:10];// 调用实例方法

[Student initWithAge:20];// 调用静态方法

11、点(.)语法
Student *stu = [[[Student alloc]init]autorelease];
stu.age = 20;
 // 相当于调用了对象的setAge方法(写)
int age = stu.age;// 相当于调用了对象的getAge方法(读)

12、self关键字
相当于java中的this,不同的是self在不同的环境下,作用也不同。在实例方法中self可以当该对象使用,在静态方法中,self可以当类对象使用。
如:
- (void)age {
   return self.age;// 这里self是实例对象本身
}

+ (id)newInstace {

//Student *stu = [[[Student alloc]init]autorelease];

Student *stu = [[[self alloc]init]autorelease];// 这一句和上一句代码的效果是等效的,而在java语法是不允许this出现在静态方法中的

return stu;
}
  

13、@class : 在头文件中声明一个类的存在

为了提高效率,在只需要知道类的存在的情况下,不需要导入某个类的头文件。

// #import "Book.h"
@class Book;
 // 不需要导入Book.h头文件,在.m文件真正使用的时候再导入
@interface Student : NSObject
@property Book *book;
@end

14、@protocol : 在头文件中声明一个协议的存在

目的和@class一样

15、^ : 定义一个Block类型,与标准C语法中指向函数指针类型的写法非常相似
如:定义一个sum的Block类型,返回值为int,有两个int形参
int (^sum) (int, int) = ^(int a, int b) {

return a + b;

}; 

16、#import : 用于导入一个类的头文件
#pragma mark : 写方法的注释
#pragma mark - : 方法注释分组
+ : 声明或定义一个静态方法
- : 声明或定义一个实例方法

17、方法定义(一个冒号代表一个参数,冒号也是属性方法的一部份)
方法类型 (返回值类型)方法名称[参数列表] {(一个冒号代表一个参数,冒号也是属性方法的一部份)
// 方法体
}

* 实例方法,方法名: sumAge:andNo:
- (int)setAge:(int)age andNo:(int)no {
// 在这里插入代码逻辑
}

* 静态方法
+ (id)initWithAge:(int)age {
// 在这里插入代码逻辑
}
注:
* 实例方法通过类的实例对象访问
* 静态方法通过类名或self访问

18、内存管理
 1> 凡是从NSObject中继承的类都需要自己管理内存,在OC语法中,创建的任何一个对象都拥有一个引用计数器,第一次创建的时候这个引用计数器为1,当引用计数器的值为0时,该对象会被销毁。内存管理涉及到以下接口:
  * release : 对象的引用计数器减1
  * retain : 对象的引用计数器加1
  * retainCount : 获取对象当前引用计数器的数量
 
  对象生命周期回调接口:
  * init : 对象的默认构造方法,如果自定义构造方法用于初始化成员变量时,必须先调用父类的构造方法,并判断获得的对象是否为nil,再初始化成员变量。
  如:- (void)initWithAge:(int)age {

     if ( self = [super init] ) {

         _age = age;

 }

 return self;

 }
 
  * dealloc : 对象销毁时,系统会自动调用该方法,通常在该方法中释放内存或其它资源。在重写dealloc方法时,注意在代码最后面调用父类的dealloc方法,用于释放内存等相关资源。

 如:

- (void)dealloc {

 [_book release];// 释放成员变量

 [super dealloc];

 }
 
 2> 不需要管理内存的对象
  * 基本数据类型
  * 系统自带的类调用自己的静态方法创建的对象,是自动释放内存的,不需要管理
 
 3> 内存管理原则
  只有向对象发送了alloc,retain,copy,new消息才有必要做release操作
  * 谁alloc,retain,copy,new谁release
  * 谁创建谁释放(release)
  * 谁没有allock,retain,copy,new,你就不要做release操作
 
 4> 自动内存管理(由autoreleasepool管理)
  在创建对象的同时,调用autorelease方法,会将该对象的一个引用自动存放到最近创建的一个自动释放释放池中。以后该对象就不需要手动来release操作,徐非做了retain,copy等修改了引用计数器的操作。当自动释放池被销毁时,会向池子中所有对象发送一个release消息,池子中的所有对象的引用计数器此时会减1,只有当池子中的引用计数器为0时,该对象才会被彻底销毁。不是说只要将对象交给自动释放池了,池子被销毁,池子中的所有对象就一定会被销毁。
 

 如:@autoreleasepool {

 Student *stu = [[[Student alloc] init]autorelease];// 此时stu对象将放到这个大括号中的自动释放池子中
 
  [stu retain];// 如果加了这一句,此时stu的引用计数器为2,这时候如果在池子销毁前没有向对象发送release消息,就算池子销毁,该对象也还是会造成内存泄露
 
  } // 程序执行到此处,代表自动释放池被销毁,意味着池子中的所有对象都会接到一个release消息

19、OC中的类似Java的toString方法
Student *stu = [[[Student alloc]init]autorelease];
NSLog(@"%@",stu);// 默认打印的是stu对象的内存地址

* 重写父类的description方法,可自定义打印对象的信息
- (NSString *)description {
   NSLog(@"age is %i",_age);

}

时间: 2024-10-22 23:59:32

OC语法总结的相关文章

Objective C Programming( OC ) 语法特点总结

移动市场是块巨大的迅速的,发展的市场,我看好它.IOS中OC是很重要的语言,通过看<Objective C Programming>,能让我对OC有个大概的了解.为了加深印象,特于此加以总结. OC是源于SmallTalk的,起源甚至比C++还早.其直接父系语言为C语言. OC通过@interface-@end以及@implementation-@end来实现类声明和定义. OC中类一般至少继承与Object类 OC中所有的类对象必须动态申请,也就是说没有局部变量这么一说. OC中类没有所谓的

【OC语法快览】二、存取方法

Accessors   存取方法 All instance variables are private in Objective-C by default, so you should use accessors to get and set values in most cases. There are two syntaxes. This is the traditional 1.x syntax: OC中所有的实例变量默认是私有的,所以多数情况下你应该使用访问器来获得和设置实例变量的值.访

【OC语法快览】五、设计类接口

Designing a Class Interface       设计类接口 The Objective-C syntax for creating a class is very simple. It typically comes in two parts.  创建类的语法是很简单的,通常包括两部分. The class interface is usually stored in the ClassName.h file, and defines instance variables a

【OC语法快览】一、方法调用

调用方法 [object method]; [object methodWithInput:input]; output = [object methodWithOutput]; output = [object methodWithInputAndOutput:input]; id myObject = [NSString string]; NSString* myString = [NSString string]; 嵌套消息 function1 ( function2() ); [NSSt

【OC语法快览】三、创建实例对象

Creating Objects        创建对象 There are two main ways to create an object. The first is the one you saw before: 创建对象主要有两种方法.第一种如下:   NSString* myString = [NSString string]; This is the more convenient automatic style. In this case, you are creating an

【OC语法快览】六、类实现

Class Implementation      类实现 Let's create an implementation, starting with the getters: 接下来创建一个类实现,从访问器开始: #import "Photo.h" @implementation Photo - (NSString*) caption { return caption; } - (NSString*) photographer { return photographer; } @en

【OC语法快览】四、基础内存管理

Basic Memory Management                                                           基础内存管理 If you're writing an application for Mac OS X, you have the option to enable garbage collection. In general, this means that you don't have to think about memory

objective-c 语法快速过(1)

有一定 c++或者 java 基础,过一遍 oc 语法即可,都是相通的,个人认为难点是 oc 的内存管理,虽然有了 ARC,但是也需要学习下,因为有旧软件的维护. 建立在C语言的基础上,增加了一层小范围的面向对象的语法(保留了面向对象最精华的部分,oc的内容没有java多,而java的内容没有c++多,c++的内容最为繁杂),OC完全兼容C语言,c和oc可以混编.可以在OC代码中混入C语言代码(前提是oc源文件扩展名是.m),甚至是C++代码(不是所有的源文件都能包含c++代码,只有源文件扩展名

ios入门OC_UI晋级学什么?

1. OC 语法初步, 你可能学到面向对象最近本的概念, 并且可以大致的建立几个自以为是的类,但这仅仅是开始. 你知道为什么面向对象要有3大特性么.知道他们是用到什么设计模式的么 2. 你可能学到了NSString, NSMutableString 字符串的基本操作方法, 你可能会花大量的时间去看那些方法. 从没考虑过方法的实用性. UI方法成千上万, 大量的时间浪费到寻找上边可能会很累的. 所以, 学会现用现看 3. 你可能学到了NSArray, NSMutableArray, NSDicti