1、类
- 声明
1、类名的第一个字母必须是大写;
2、不能有下划线;
3、多个英文单词用驼峰标识;
4、实例方法以减号 - 开头,类方法以+开头;
5、 OC方法中任何数据类型都必须要用()扩住,OC方法中的小括号():只有一个作用,用来扩住数据类型
6、声明在@interface和@end之间进行;
#import <Foundation/Foundation.h> // 因为使用了NSObject
@interface Car : NSObject // NSObject目的是:让Car这个类具备创建对象的能力
{
@public // @public关键字,可以让外部的指针间接访问内部的成员变量
int wheels; // 轮胎个数
int speed; // 时速 xxkm/h
// 大括号里面只能写属性不能写行为
}
- (void)run; // 定义实例方法
+ (void)runWith:(NSString *) p1 andWith:(NSString *)p2 // 定义对象方法
@end
- 实现
实现在@implementation和@end之间进行
@implementation Car
- (void)run
{
NSLog(@"车子跑起来了!"); // 实现声明的方法
}
@end
2、点语法和id指针
1、点语法的本质是方法的调用,而不是访问成员变量,当使用点语法时,编译器会自动展开成相应的方法。
2、切记点语法的本质是转换成相应的set和get方法,如果没有set和get方法,则不能使用点语法。
3、避免死循环,避免这种写法:
(1)在set方法中,self.age=age;相当于是[self setAge:age];
(2)在get方法中,return self.age;相当于是[self age];
4、id是万能指针,能指向或者说操作任何OC对象 。注意:id后面不要加上 *
3、一些关键字
@property 和 @synthesize
1、@property 关键字可以自动生成某个成员变量的setter和getter方法的声明;
2、@synthesize关键字可以帮助生成成员变量的setter和getter方法的实现。
@property int age;
// 编译时遇到这一行,则自动扩展成下面两句:
- (void)setAge:(int)age;
- (int)age;
// 语法:
@synthesize age = _age;
// 相当于下面的代码:
- (void)setAge:(int)age
{
_age = age;
}
- (int)age
{
return _age;
}
3、若手动实现了setter方法,编译器就只会自动生成getter方法和不存在的成员变量;
若手动实现了getter方法,编译器就只会自动生成setter方法和不存在的成员变量;
若同时手动实现了setter和getter方法,编译器就不会自动生成不存在的成员变量;
4、自从Xcode4.4后,@property就独揽了@synthesize的功能,也就是说,@property可以同时生成setter和getter的声明和实现
默认情况下,setter和getter方法中的实现,会去访问下划线_ 开头的成员变量。
5、@property 参数
- 内存管理相关的参数
- retain:release旧值,retain新值(适用于OC对象类型),引用地址复制
- assign:直接赋值(默认的,适用于非OC对象类型),也就是基本数据类型的赋值默认有个assign参数
- copy:release旧值,copy新值,值复制
- 是否要生成set方法
- readwrite:同时生成setter和getter的声明跟实现
- readonly:只会生成getter的声明跟实现
- 多线程管理
- nonatomic:性能高(一般就用这个)
- atomic:性能低(默认)
- setter和getter方法的名称
- setter:决定了set方法的名称,一定要有个冒号:
- getter:决定了get方法的名称(一般用在BOOL类型的get方法)
@protocal(TS中的抽象类)
1、可以用来声明一大堆方法(不能声明成员变量)
2、只要某个类遵守了这个协议,就相当于拥有这个协议中的所有方法声明
3、只要父类遵守了某个协议,就相当于子类也遵守了
4、定义协议:
@protocol 协议名称 <NSObject> //遵守基协议
// 方法声明列表....
@end
5、遵守协议
@interface 类名 : 父类名 <协议名称1, 协议名称2>
@end
instancetype
使那些非关联返回类型的方法返回所在类的类型,就是规定方法的返回值,有点类似链式调用
@interface NSArray
+(id)constructAnArray;
@end
[NSArray constructAnArray] // 返回类型是 id
@interface NSArray
+(instancetype)constructAnArray;
@end
[NSArray constructAnArray] // 返回类型是 NSArray
4、分类(前端里的装饰器)
1、可以给某一个类扩充一些方法(不修改原来类的代码)
2、语法:
// 声明
@interface 类名(分类名称)
@end
// 实现
@implementation 类名(分类名称)
@end
网友评论