今日主要学习了一些关键字:property,synthesizea,内存管理方面基础知识。下面代码与注释就可以基本熟悉了今天的学习内容以及OC中的一些语法上面的知识了。
#import <Foundation/Foundation.h>
@interface Car : NSObject
{
@private int _wheels;//将基类成员显式声明为@private
/*虽然使用了property关键字,但是它仅仅在当前类的对象中直接使用。但是如果当前类被继承了,那么子类需要访问私有变量时,那么需要需要在基类重新定义该成员,但是需要注意一点就是该变量从原来的私有变量的属性被修改为保护属性了。此时子类就是直接访问一个属性为保护特性的基类成员变量了。如果还想要封装该变量为私有变量,那么需要添加显示的@private关键字,因为默认是@protected的。此时需要基类要写一个方法,让子类调用从而访问到基类的私有成员了,访问属性与c++是一样的。
*/
}
@property int wheels;/*使用property,自动生成‘_’前缀的私有变量和隐藏了set和get方法,减小了代码的编写;而且对象可以类似显示地访问对象的私有变量,代码显得更加通俗易懂.*/
- (void) test;
- (void) updatewheels: (int)gwheels;//当子类要访问基类的私有成员,需要通过调用基类的方法才能成功访问。如果要访问的成员变量是@protected就可以直接super了该变量实现访问了。
@end
@interface benz : Car //继承Car类
- (void) testbenz;
@end
int main()
{
Car *c=[[Car alloc] init];
benz *bc=[[benz alloc] init];
c.wheels=4;//直接“显示”地访问基类的私有成员,property关键字的作用
[c test];
NSLog(@"wheel:%d",c.wheels);//此时相当于调用了get放啊
[c release];//使用了alloc,必须使用release释放该内存,否则你懂的
c=bc;//基类指针指向子类指针,下面的用法都是跟C++一样的。
[bc testbenz];
[bc test];
[c test];
NSLog(@"---------------");
[bc release];//因为当前bc是子类,释放该内存的时候,会先释放基类内存,在释放子类内存,具体实现可以看到benz的dealloc函数的实现。只有这样才能彻底释放内存,这个跟C++一样的。
return 0;
}
@implementation Car
- (void) test
{
NSLog(@"the wheels:%d\r\n",_wheels);
}
- (void) updatewheels:(int)gwheels
{
_wheels=gwheels;
}
- (void) dealloc
{
NSLog(@"释放Car的内存\r\n");
[super dealloc];//必须使用当前的语法结构
}
- (NSString *)description
{
return [NSString stringWithFormat:@"wheels:%d",_wheels];
}
@end
@implementation benz
- (void)testbenz
{
// _wheels=14;
[super updatewheels:5];//访问基类的私有成员变量,使用super关键字
NSLog(@"test benz \r\n");
}
- (void)dealloc
{
NSLog(@"释放benz的内存\r\n");
[super dealloc];
}
@end
下面就是输出的效果了。上面的内容都是可以跟C++作对比,就可以知道OC和C++的不同与相同了,从而更加了解了OC得语法。
chuckdeMacBook-Pro:property chuck-qin$ cc -c property.m
chuckdeMacBook-Pro:property chuck-qin$ cc property.o -framework Foundation
chuckdeMacBook-Pro:property chuck-qin$ ./a.out
2014-08-24 16:41:07.228 a.out[1410:507] the wheels:4
2014-08-24 16:41:07.260 a.out[1410:507] wheel:4
2014-08-24 16:41:07.260 a.out[1410:507] 释放Car的内存
2014-08-24 16:41:07.261 a.out[1410:507] test benz
2014-08-24 16:41:07.261 a.out[1410:507] the wheels:5
2014-08-24 16:41:07.261 a.out[1410:507] the wheels:5
2014-08-24 16:41:07.262 a.out[1410:507] ---------------
2014-08-24 16:41:07.262 a.out[1410:507] 释放benz的内存
2014-08-24 16:41:07.263 a.out[1410:507] 释放Car的内存