OC_第一个类,@property和 @synthesize,Category,description方法
1类
1.类的设计:
1>类名
* 类名的第一个字母必须是大写
* 不能有下划线
* 多个英文单词,用驼峰标识
2>属性
3>行为(功能)
例如:
.电脑
* 类名:Computer
* 属性:band、expireDate
* 行为:open、close
2.一个完整的类
/*
类名:Car
属性:轮胎个数、时速(速度)
行为:跑
*/
// 因为使用了NSObject
#import <Foundation/Foundation.h>
// 完整地写一个函数:函数的声明和定义(实现)
// 完整地写一个类:类的声明和实现
// 1.类的声明
// 声明对象的属性、行为
// : NSObject 目的是:让Car这个类具备创建对象的能力
@interface Car : NSObject
{//用来声明对象属性(实例变量\成员变量,默认会初始化为0)
// @public可以让外部的指针间接访问对象内部的成员变量
@public
int wheels;// 轮胎个数
int speed;// 时速(xxkm/h)
}
// 方法(行为):方法名、参数、返回值(声明、实现)
// 只要是OC对象的方法,必须以减号 - 开头
// OC方法中任何数据类型都必须用小括号()扩住
// OC方法中的小括号():括住数据类型
- (void)run;
@end
// 2.类的实现
// 用来实现@inteface中声明的方法
@implementation Car
// 方法的实现(说清楚方法里面有什么代码)
- (void)run
{
NSLog(@"车子跑起来了");
}
@end
int main()
{
//在OC中,想执行一些行为,就写上一个中括号[行为执行者行为名称]
//利用类来创建对象
//执行了Car这个类的new行为来创建新对象
//定义了一个指针变量p,p将来指向的是Car类型的对象
// [Car new]每次都会创建出一个新对象,并且会返回新对象本身(新对象的地址)
Car*p = [Car new];
Car*p2 = [Car new];
p2->wheels =5;
p2->speed =300;
[p2run];
//给p所指向对象的wheels属性赋值
p->wheels =4;
p->speed =250;
//给p所指向对象发送一条run消息
[prun];
NSLog(@"车子有%d个轮子,时速位:%dkm/h", p->wheels, p2->speed);
return0;
}
2@property和@synthesize
// @property:可以自动生成某个成员变量的setter和getter声明
@propertyintage;
//- (void)setAge:(int)age; //等效于这一串
//- (int)age;
@propertyintheight;
//- (void)setHeight:(int)height; //等效于这一串
//- (int)height;
// @synthesize自动生成age的setter和getter实现,并且会访问_age这个成员变量
@synthesize age = _age; //如果没有,活自动生成
@synthesize height = _height;
或
@synthesize weight = _weight, name = _name;
/*
1.set方法内存管理相关的参数
*retain : release旧值,retain新值(适用于OC对象类型)
*assign :直接赋值(默认,适用于非OC对象类型)
*copy : release旧值,copy新值
2.是否要生成set方法
*readwrite :同时生成setter和getter的声明、实现(默认)
*readonly :只会生成getter的声明、实现
3.多线程管理
*nonatomic :性能高 (一般就用这个)
*atomic :性能低(默认)
4.setter和getter方法的名称
*setter :决定了set方法的名称,一定要有个冒号 :
*getter :决定了get方法的名称(一般用在BOOL类型)
*/
//- (void)setBook:(Book *)book //retain相当于做了这些操作
//{
// if (_book != book)
// {
// [_book release];
//
// _book = [book retain];
// }
//}
3 Category
/*
分类的作用:在不改变原来类内容的基础上,可以为类增加一些方法
使用注意:
1.分类只能增加方法,不能增加成员变量
2.分类方法实现中可以访问原来类中声明的成员变量
3.分类可以重新实现原来类中的方法,但是会覆盖掉原来的方法,会导致原来的方法没法再使用
4.方法调用的优先级:分类(最后参与编译的分类优先) --> 原来类 -->父类
*/
// 优先去分类中查找,然后再去原来类中找,最后再去父类中找
4description
Nslog函数输出以后执行的方法
// //决定了实例对象的输出结果
//- (NSString *)description
//{
// //下面代码会引发死循环
// // NSLog(@"%@", self);
// return [NSString stringWithFormat:@"age=%d, name=%@", _age,_name];
// //return @"3424324";
//}