DELL-@DELL ~
$ cd /home
DELL-@DELL /home
$ ./gcc20151224.sh
2015-12-24 17:49:59.604 oc20151224[23176] Score.setCScore 78
2015-12-24 17:49:59.604 oc20151224[23176] Score.cScore 78
2015-12-24 17:49:59.619 oc20151224[23176] 78
组合(Composition)
#import <Foundation/Foundation.h>
@interface Score : NSObject
{
int _cScore;
}
- (void)setCScore:(int)cScore;
- (int)cScore;
@end
@implementation Score
- (void)setCScore:(int)cScore
{
_cScore = cScore;
NSLog(@"Score.setCScore %d",_cScore);
}
- (int)cScore
{
NSLog(@"Score.cScore %d",_cScore);
return _cScore;
}
@end
@interface Student : NSObject
{
@public
Score *_score; //组合
int _age;
}
- (void)setScore:(int)cScore;
- (int)score;
@end
@implementation Student
- (void)setScore:(int)cScore
{
[_score setCScore:cScore];
}
- (int)score
{
int cs = [_score cScore];
return cs;
}
@end
int main()
{
Student *stu= [Student new];
stu->_score = [Score new];
[stu setScore:78];
NSLog(@"%d",[stu score]);
return 0;
}
DELL-@DELL /home
$ ./gcc20151224.sh
2015-12-24 16:30:35.278 oc20151224[9984] Parent.setData
2015-12-24 16:30:35.388 oc20151224[9984] num1=666
继承(Inheritance)
#import <Foundation/Foundation.h>
@interface Parent : NSObject
{
int num1;
}
-(void) setData;
@end
@implementation Parent
-(void) setData
{
num1=666;
NSLog(@"Parent.setData");
}
@end
@interface Child : Parent
-(void) print;
@end
@implementation Child
-(void) print
{
NSLog(@"num1=%i",num1);
}
@end
int main(int argc,const char *argv[])
{
NSAutoreleasePool *pool=[[NSAutoreleasePool alloc] init];
Child *objChild=[[Child alloc] init];
[objChild setData];
[objChild print];
[objChild release];
[pool drain];
return 0;
}
父类和子类有相同的方法时
DELL-@DELL /home
$ ./gcc20151224.sh
2015-12-24 16:43:33.136 oc20151224[9184] Child.setData
2015-12-24 16:43:33.153 oc20151224[9184] num1=888,num2=999
#import <Foundation/Foundation.h>
@interface Parent : NSObject
{
int num1;
}
-(void) setData;
@end
@implementation Parent
-(void) setData
{
num1=666;
NSLog(@"Parent.setData");
}
@end
@interface Child : Parent
{
int num2;
}
-(void) setData;
-(void) print;
@end
@implementation Child
-(void) setData
{
num1=888;
num2=999;
NSLog(@"Child.setData");
}
-(void) print
{
//NSLog(@"num1=%i",num1);
NSLog(@"num1=%i,num2=%i",num1,num2);
}
@end
int main(int argc,const char *argv[])
{
NSAutoreleasePool *pool=[[NSAutoreleasePool alloc] init];
Child *objChild=[[Child alloc] init];
[objChild setData];
[objChild print];
[objChild release];
[pool drain];
return 0;
}
DELL-@DELL /home
$ ./gcc20151224.sh
2015-12-24 17:00:59.388 oc20151224[188] Dog-eat
多态(Polymorphism)
#import <Foundation/Foundation.h>
@interface Animal : NSObject
- (void)eat;
@end
@implementation Animal
- (void)eat
{
NSLog(@"Animal-eat");
}
@end
@interface Dog : Animal
@end
@implementation Dog
- (void)eat
{
NSLog(@"Dog-eat");
}
@end
int main()
{
Animal* a = [Dog new];
[a eat];
return 0;
}
DELL-@DELL /home
$ ./gcc20151224.sh
2015-12-24 17:11:37.051 oc20151224[10320] Animal-eat
2015-12-24 17:11:37.061 oc20151224[10320] Dog-eat
2015-12-24 17:11:37.065 oc20151224[10320] Cat-eat
2015-12-24 17:11:37.071 oc20151224[10320] Dog-eat
#import <Foundation/Foundation.h>
@interface Animal : NSObject
- (void)eat;
@end
@implementation Animal
- (void)eat
{
NSLog(@"Animal-eat");
}
@end
@interface Dog : Animal
@end
@implementation Dog
- (void)eat
{
NSLog(@"Dog-eat");
}
@end
/*
int main()
{
Animal* a = [Dog new];
[a eat];
return 0;
}
*/
// Cat
@interface Cat : Animal
@end
@implementation Cat
- (void)eat
{
NSLog(@"Cat-eat");
}
@end
void feed(Animal* a)
{
[a eat];
}
int main()
{
Animal* a = [Animal new];
feed(a);
Dog* d = [Dog new];
feed(d);
Cat* c = [Cat new];
feed(c);
Animal* aa = [Dog new];
feed(aa);
return 0;
}
20160107添加:
5.6继承与多态
当一个类不再存在父类时,称为根类。
在开发Objective-C程序语言的项目时,开发者定义的类几乎都是NSObject根类的派生子类。
5.6.1来自父类的继承
DELL-@DELL ~
$ cd /home
DELL-@DELL /home
$ ./gcc20160107.sh
2016-01-07 10:28:34.273 oc20160107[5528] x=10
#import<Foundation/Foundation.h>
//#import<Foundation/NSObject.h>
@interface ClassA:NSObject
{
int x;
}
-(void)initVar;
@end
@implementation ClassA
-(void)initVar
{
x=10;
}
@end
@interface ClassB:ClassA
-(void)printVar;
@end
@implementation ClassB
-(void)printVar
{
NSLog(@"x=%i",x);
}
@end
int main(int arvc, char* argv[])
{
NSAutoreleasePool *pool=[[NSAutoreleasePool alloc] init];
ClassB * b = [[ClassB alloc] init];
[b initVar];
[b printVar];
[b release];
[pool drain];
return 0;
}
5.7.1自动释放池
建立一个自动释放池的实例对象。这里的自动释放池对象所管理的对象只局限于Foundation类中的对象。
在程序需要退出或者执行完毕后,需要通过代码来释放这个池。
当这条语句执行时,所有自动释放池中的对象都得到释放,并且这一过程都是自动完成的。
5.7.2引用计数
自动释放池能够实现的基础就是引用计数技术。
alloc方法进行内存分配时,引用次数为1。
Objective-C程序语言中增加一个对象的引用计数方法为:
[对象名 retain]
当程序不再需要此对象时,就可以调用释放方法:
[对象名 release]
此时,自动释放池就会判断。如果此时对象引用计数的值恰为1,则释放此对象;如果大于1,则将其减1。
5.7.3垃圾回收
iOS设备的运行环境并不支持垃圾回收机制。只能够依靠自动释放池和引用计数的方式来管理内存对象。
DELL-@DELL /home
$ cd /home
DELL-@DELL /home
$ ./gcc20151229.sh
2015-12-29 17:48:33.211 ns_number[22704] <
2015-12-29 17:48:33.226 ns_number[22704] 5
2015-12-29 17:48:33.226 ns_number[22704] 3.140000
2015-12-29 17:48:33.226 ns_number[22704] 6.700000
2015-12-29 17:48:33.226 ns_number[22704] A
由NSNumber类别所建立的对象称为数值对象。其中NS是Next Step的缩写。Objective-C的基本数据类型,如int、double、char、BOOL等,都必须先转换为NSNumber类别,否则无法储存为Foundation framework的数值对象。
#import<Foundation/Foundation.h>
int main(int arvc, char* argv[])
{
NSAutoreleasePool *pool=[[NSAutoreleasePool alloc] init];
//基本数据类型
//专门用来装基础类型的对象
NSNumber * intNumber = [[NSNumber alloc] initWithInt:5];
NSNumber * intNumber2 = [NSNumber numberWithInt:6];
BOOL ret = [intNumber isEqualToNumber:intNumber2]; //这种比较也是可以跨不同对象的,比如:比较intNumber和floatNumber
//比较两个整型的NSNumber的大小
if ([intNumber compare:intNumber2] == NSOrderedAscending) {
NSLog(@"<");
}else if([intNumber compare:intNumber2] == NSOrderedSame){
NSLog(@"=");
}else if([intNumber compare:intNumber2] == NSOrderedDescending){
NSLog(@">");
}
NSNumber * floatNumber = [[NSNumber alloc] initWithFloat:3.14f];
NSNumber * doubleNumber = [[NSNumber alloc] initWithDouble:6.7];
NSNumber * charNumber = [[NSNumber alloc] initWithChar:'A'];
//通过以下方法可以还原这些基本数据类型的数据
NSLog(@"%d",[intNumber intValue]);
NSLog(@"%f",[floatNumber floatValue]);
NSLog(@"%f",[doubleNumber doubleValue]);
NSLog(@"%c",[charNumber charValue]);
[pool drain];
return 0;
}
DELL-@DELL /home
$ ./gcc20151229.sh
2015-12-29 19:16:12.113 oc20151229[33244] 4
2015-12-29 19:16:12.125 oc20151229[33244] ret=1
2015-12-29 19:16:12.129 oc20151229[33244] ret2=1
2015-12-29 19:16:12.133 oc20151229[33244] ret3=1
2015-12-29 19:16:12.137 oc20151229[33244] before remove:2
2015-12-29 19:16:12.141 oc20151229[33244] after remove:1
2015-12-29 19:16:12.145 oc20151229[33244] after remove:0
数据集对象包括不可变更的数据集对象与可变更的数据集对象。可变更的数据集NSMutableSet是不可变更的数据集NSSet的子类。
#import<Foundation/Foundation.h>
int main(int arvc, char* argv[])
{
NSAutoreleasePool *pool=[[NSAutoreleasePool alloc] init];
NSSet * set = [[NSSet alloc] initWithObjects:@"one",@"two",@"three",@"four", nil];
// 返回集合中对象的个数
NSLog(@"%i",[set count]);
// 判断集合中是否拥有@“two”
BOOL ret = [set containsObject:@"two"];
NSLog(@"ret=%i",ret);
NSSet * set2 = [[NSSet alloc] initWithObjects:@"one",@"two",@"three",@"four", nil];
// 判断两个集合是否相等
BOOL ret2 = [set isEqualToSet:set2];
NSLog(@"ret2=%i",ret2);
NSSet * set3 = [[NSSet alloc] initWithObjects:@"one",@"two",@"three",@"four",@"five", nil];
// 判断set是否是set3的子集合
BOOL ret3 = [set isSubsetOfSet:set3];
NSLog(@"ret3=%i",ret3);
//可变集合NSMutableSet
NSMutableSet * mset = [[NSMutableSet alloc] init];
[mset addObject:@"one"];
[mset addObject:@"two"];
[mset addObject:@"two"]; //如果添加的元素有重复,实际只保留一个
NSLog(@"before remove:%i",[mset count]);
// 删除元素
[mset removeObject:@"two"];
NSLog(@"after remove:%i",[mset count]);
[mset removeAllObjects];
NSLog(@"after remove:%i",[mset count]);
[pool drain];
return 0;
}
DELL-@DELL /home
$ ./ns_array.sh
2015-12-29 19:02:22.530 ns_array[7164] (One, Two, Three, Four)
2015-12-29 19:02:22.542 ns_array[7164] One
2015-12-29 19:02:22.546 ns_array[7164] Two
2015-12-29 19:02:22.550 ns_array[7164] Three
2015-12-29 19:02:22.554 ns_array[7164] Four
2015-12-29 19:02:22.558 ns_array[7164] One
2015-12-29 19:02:22.562 ns_array[7164] Two
2015-12-29 19:02:22.566 ns_array[7164] Three
2015-12-29 19:02:22.570 ns_array[7164] Four
2015-12-29 19:02:22.574 ns_array[7164] One
2015-12-29 19:02:22.578 ns_array[7164] Two
2015-12-29 19:02:22.582 ns_array[7164] Three
2015-12-29 19:02:22.582 ns_array[7164] Four
2015-12-29 19:02:22.586 ns_array[7164] before remove:3
2015-12-29 19:02:22.594 ns_array[7164] after remove:2
2015-12-29 19:02:22.598 ns_array[7164] after remove:1
2015-12-29 19:02:22.602 ns_array[7164] after remove:0
数组对象包括不可变更的数组对象与可变更的数组对象。可变更的数组NSMutableArray是不可变更的数组NSArray的子类。
#import<Foundation/Foundation.h>
int main(int arvc, char* argv[])
{
NSAutoreleasePool *pool=[[NSAutoreleasePool alloc] init];
NSArray *array = [[NSArray alloc] initWithObjects:@"One", @"Two", @"Three", @"Four", nil];
// 打印数组,实际上是打印数据的每一个对象。因为数组重写的Description方法
NSLog(@"%@", array);
// 枚举器法
NSEnumerator *enumerator = [array objectEnumerator];
id obj;
while (obj = [enumerator nextObject]) {
NSLog(@"%@", obj);
}
// 快速枚举法
for(id obj in array){
NSLog(@"%@", obj);
}
// 使用i值遍历
NSUInteger length = [array count]; //返回数组元素的个数
obj = [array objectAtIndex:2]; //返回单个元素的地址
NSInteger i;
for(i = 0; i<[array count];i++){
NSLog(@"%@", [array objectAtIndex:i]);
}
NSMutableArray *array1 = [[NSMutableArray alloc] init];
// 往可变数组中添加元素
[array1 addObject:@"one"];
[array1 addObject:@"two"];
[array1 addObject:@"three"];
NSLog(@"before remove:%i",[array1 count]);
// 交换两个数组的位置
[array1 exchangeObjectAtIndex:0 withObjectAtIndex:2];
// 删除元素,remove
[array1 removeObject:@"one"];
NSLog(@"after remove:%i",[array1 count]);
[array1 removeObjectAtIndex:1];
NSLog(@"after remove:%i",[array1 count]);
[array1 removeAllObjects];
NSLog(@"after remove:%i",[array1 count]);
[pool drain];
return 0;
}
DELL-@DELL /home
$ ./ns_dictionary.sh
2015-12-29 18:40:05.559 ns_dictionary[22600] one
2015-12-29 18:40:05.574 ns_dictionary[22600] 3
2015-12-29 18:40:05.574 ns_dictionary[22600] three
2015-12-29 18:40:05.574 ns_dictionary[22600] 1
2015-12-29 18:40:05.574 ns_dictionary[22600] one
2015-12-29 18:40:05.590 ns_dictionary[22600] 2
2015-12-29 18:40:05.590 ns_dictionary[22600] two
2015-12-29 18:40:05.590 ns_dictionary[22600] before remove:2
2015-12-29 18:40:05.590 ns_dictionary[22600] after remove:1
词典对象分为不可变更的词典对象与可变更的词典对象。可变更的词典NSMutableDictionary是不可变更的词典NSDictionary的子类。
#import<Foundation/Foundation.h>
int main(int arvc, char* argv[])
{
NSAutoreleasePool *pool=[[NSAutoreleasePool alloc] init];
NSDictionary *dict = [[NSDictionary alloc] initWithObjectsAndKeys:@"one",@"1",@"two",@"2",@"three",@"3", nil];
// 通过键快速的找到值
NSString *str = [dict objectForKey:@"1"];
NSLog(@"%@",str);
// 这种方式遍历到的是键Key,获得了键,也就获得了值
for(id obj in dict){
NSLog(@"%@",obj);
NSLog(@"%@",[dict objectForKey:obj]);
}
// 初始化
NSMutableDictionary *mDict = [[NSMutableDictionary alloc] init];
//添加
[mDict setObject:@"one" forKey:@"1"];
[mDict setObject:@"two" forKey:@"2"];
NSLog(@"before remove:%i",[mDict count]);
//删除
[mDict removeObjectForKey:@"1"];
NSLog(@"after remove:%i",[mDict count]);
[pool drain];
return 0;
}
DELL-@DELL ~
$ cd /home
DELL-@DELL /home
$ ./gcc20151225.sh
2015-12-25 15:00:51.021 oc20151225[20000] num1=100,num2=200
2015-12-25 15:00:51.031 oc20151225[20000] total=300
封装(Encapsulatation)
等价的语句:
//myClass *obj=[[myClass alloc] init];
myClass *obj=[myClass new];
#include <Foundation/Foundation.h>
@interface myClass:NSObject
{
int num1,num2;
}
-(void)setData;
-(int)sum;
-(void)output;
@end
@implementation myClass
-(void)setData
{
num1=100;
num2=200;
}
-(int)sum
{
return (num1+num2);
}
-(void)output
{
NSLog(@"num1=%i,num2=%i",num1,num2);
}
@end
int main(int argc,const char *argv[])
{
NSAutoreleasePool *pool=[[NSAutoreleasePool alloc] init];
myClass *obj=[[myClass alloc] init];
[obj setData];
int total=[obj sum];
[obj output];
NSLog(@"total=%i",total);
[obj release];
[pool drain];
return 0;
}
DELL-@DELL /home
$ ./gcc20151225.sh
2015-12-25 17:09:10.466 oc20151225[20428] num1=100,num2=200
2015-12-25 17:09:10.488 oc20151225[20428] num1=100,num2=200
2015-12-25 17:09:10.494 oc20151225[20428] num1=100,num2=200
2015-12-25 17:09:10.499 oc20151225[20428] total=300
以@property与@synthesize取代setter与getter方法
#include <Foundation/Foundation.h>
@interface myClass:NSObject
{
int num1,num2;
}
@property int num1,num2;
-(void)setData;
-(int)sum;
-(void)output;
@end
@implementation myClass
@synthesize num1,num2;
-(void)setData
{
num1=100;
num2=200;
}
-(int)sum
{
return (num1+num2);
}
-(void)output
{
NSLog(@"num1=%i,num2=%i",num1,num2);
}
@end
int main(int argc,const char *argv[])
{
NSAutoreleasePool *pool=[[NSAutoreleasePool alloc] init];
//myClass *obj=[[myClass alloc] init];
myClass *obj=[myClass new];
//[obj setData];
//[obj setNum1:100];
//[obj setNum2:200];
obj.num1=100;
obj.num2=200;
NSLog(@"num1=%i,num2=%i",[obj num1],[obj num2]);
NSLog(@"num1=%i,num2=%i",obj.num1,obj.num2);
int total=[obj sum];
[obj output];
NSLog(@"total=%i",total);
[obj release];
[pool drain];
return 0;
}
http://www.cnblogs.com/dyllove98/archive/2013/07/25/3215142.html
DELL-@DELL /home
$ ./gcc20151225.sh
2015-12-25 22:39:17.774 oc20151225[932] str :hi
2015-12-25 22:39:17.785 oc20151225[932] str2 :hxh
2015-12-25 22:39:17.791 oc20151225[932] str3 :test3
2015-12-25 22:39:17.797 oc20151225[932] :1
2015-12-25 22:39:17.800 oc20151225[932] :1
2015-12-25 22:39:17.806 oc20151225[932] :{location=3, length=3}
2015-12-25 22:39:17.812 oc20151225[932] :{location=6, length=3}
2015-12-25 22:39:17.817 oc20151225[932] 789
2015-12-25 22:39:17.821 oc20151225[932] 123456
2015-12-25 22:39:17.830 oc20151225[932] 234
2015-12-25 22:39:17.838 oc20151225[932] (1, 2, a, b, c)
2015-12-25 22:39:17.844 oc20151225[932] Path is:User/Wildcat/APP
2015-12-25 22:39:17.847 oc20151225[932] Array is:(User, Wildcat, APP)
2015-12-25 22:39:17.855 oc20151225[932] Array is:User/Wildcat
2015-12-25 22:39:17.858 oc20151225[932] Array is:User/Wildcat/APP/123.txt
2015-12-25 22:39:17.861 oc20151225[932] 123
2015-12-25 22:39:17.863 oc20151225[932] length=10
2015-12-25 22:39:17.867 oc20151225[932] b
2015-12-25 22:39:17.870 oc20151225[932] abc