Welcome My Friend

Objective-C学习笔记

Objective-C笔记

  • .m文件代表的是message,指的是OC的一种主要特性。
  • #import是让编译器在头文件中查询定义
  • 框架是一种聚集在一个单元的部件集合,包含头文件,库,图像,声音文件等,Foundation框架的头文件Foundation.h包含一百多个文件,一旦使用#import<Foundation/Foundation.h>, 那么将会获得全部集合。
  • argc是命令行总的参数个数,argv[]是argc个参数,其中第0个参数是程序的全名,以后的参数命令行后面跟的用户输入的参数,char *argv[]是一个字符数组,其大小是int argc,主要用于命令行参数argv[]参数,数组里每个元素代表一个参数
  • 特别的.h文件和.m文件build之前一定要将.h文件右键properties->advance下的compiler…改为objc,这在环境搭建的blog也有提到

创建类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
//头文件Fraction.h
#import<Foundation/Foundation.h>
@interface Fraction:NSObject
{
int numerator;
int denominator;//成员变量,这里是private的字段,数据存储在字段中,修改字段才修改数据。封装起来,保证数据安全。
}
-(void) print;
-(void) setNumerator:(int) n;
-(void) setDenominator:(int) d;
-(int) numerator;
-(int) denominator;//这里是属性,有get和set方法
//.m文件
#import<stdio.h>
#import"Fraction.h"
@implementation Fraction
-(void) print
{
printf("%i/%i",numerator,denominator);
}
-(void) setNumeration:(int) n
{
numerator=n;
}
...
-(int) denominator
{
return denominator;//属性中get方法,这样上面print可以访问成员变量
}
@end
//main函数中使用
//头文件中要包含:Fraction.h
Fraction *frac=[[Fraction alloc] init];
[frac print];
[frac setNumeration:1];
[frac release];
//多个参数,-(void)setNumerator:(int) n andDeminator:(int) d;

构造子,先看一下构造函数和析构函数 的区别。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//.h里面的声明
-(Fraction*) initWithNumerator:(int)n denomination:(int)d
//.m具体实现方法
-(Fraction*) initWithNumerator:(int)n denomination:(int)d
{
_self=[super init];
if(_self)
{
[_self setNumerator:n andDenomitor:d];
}
return _self;
}//if(_self)等同if(_self!=nil),nil等同于NULL,
//main函数中实现
Fraction *frac3 = [[Fraction alloc] initWithNumerator: 3 denominator: 10];
printf( "Fraction 3 is: " );
[frac3 print];
printf( "\n" );
  • self 是指指向自己的指针

Class level access

  • 前面带有减号(-) 的方法为实例方法,必须使用类的实例才可以调用的。对应的有+号, 代表是类的静态方法,不需要实例化即可调用。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
//ClassA.h
#import <Foundation/NSObject.h>
static int count;
@interface ClassA: NSObject
+(int) initCount;
+(void) initialize;
@end
//ClassA.m
#import "ClassA.h"
@implementation ClassA
-(id) init
{
_self = [super init];
count++;
return _self;
}
+(int) initCount
{
return count;
}
+(void) initialize
{
count = 0;
}
@end
main.m
#import "ClassA.h"
#import <stdio.h>
int main( int argc, const char *argv[] )
{
ClassA *c1 = [[ClassA alloc] init];
ClassA *c2 = [[ClassA alloc] init];
// print count
printf( "ClassA count: %i\n", [ClassA initCount] );
ClassA *c3 = [[ClassA alloc] init];
// print count again
printf( "ClassA count: %i\n", [ClassA initCount] );
[c1 release];
[c2 release];
[c3 release];
return 0;
}
output:
ClassA count: 2
ClassA count: 3
  • 类方法用类名访问,实例方法用示例名访问。静态方法可以直接调用,实例方法要先成生实例,通过实例调用方法,静态速度很快,但是多了会占内存。静态内存是连续的,因为是在程序开始时就生成了,而实例申请的是离散的空间,所以当然没有静态方法快,而且静态内存是有限制的,太多了程序会启动不了。

  • 类方法可以计算一个实体被instance几次,还可以共享数据,它不需要访问或者修改某个实例的成员变量。类方法一般用于实现一些工具方法,比如对某个对象进行扩展,或者实现单例。如果需要访问或者修改某个实例的成员变量时,将该方法定义成实例方法。如果需要访问或者修改某个实例的成员变量时,将该方法定义成实例方法。

    插入一点:windows要通过各种各样的句柄来标识诸如应用程序实例,窗口,图标菜单等对象。句柄的实际值对程序来讲无光紧要,这个值是用来引用相应对象的。句柄与普通指针的区别在于,指针包含的是引用对象的内存地址,而句柄则是由系统所管理的引用标识,该标识可以被系统重新定位到一个内存地址上。这种间接访问对象的模式增强了系统对引用对象的控制。

这里留给异常

继承多态以及其他实体导向功能

ID类型

  • Objective-C有一种id的类型,操作有些像void*,不过它却严格规定只能用在实体上。Objective-C与Java、C++不一样,在调用一个实体的方法时,并不需要知道这个实体的类型。当然,这个方法一定要存在,在称为Objective-C的消息传递。这种动态连接有显而易见的好处。你不需要知道你调用的方法的那个实体是什么类型,如果这个实体对这个消息有反应,那就会调用这个方法。这也不会牵涉到一堆繁琐的类型转换,比如在Java里调用一个整形实体的.intValue()就要先转换,然后才能调用这个方法。
1
2
3
id number;
number=comp;
[number print];

继承

  • 关于_self=[super init] ,下面一段代码

    • [super init]的作用:面向对象的体现,先利用父类的init方法为子类实例的父类部分属性初始化。在iOS下,所有的类都继承于NSObject,而NSObject的init方法很简单,就是return _self。当父类的初始化完成之后,即_self不为nil的情况下,就可以开始做子类的初始化了。
    • 把[_self init]付给_self,防止父类release掉了self指向的空间并重新获得alloc了一块空间,如果[self init]alloc失败,则不执行if语句内容。
    • super作为消息接受者的实质:super并不是真正的指针,[super message]的实质是由self来接受父类的message。需要注意的是,[super message]中,message方法出现的self为[super message]语境中的self,即子类实例。
1
2
3
4
5
6
_self=[super init];
if(_self)
{
[_self setWidth:w height:h];
}
return _self;
  • 重要一点:if( self = [super init] )这是一种通常的建议写法,赋值并测零只是为了防止超类在初始化过程中发生改变,返回了不同的对象

注:所有self前面均无_,只是hexo的时候会报错,所以选择加上

-------------本文结束-------------

文章作者: Summary
文章链接: http://noblestaspiration.net/2018/03/26/Objective-C笔记/
版权声明:博客所有文章除特别声明外,均采用 CC BY-NC-ND 4.0 许可协议,转载请注明出处!

想要分我一杯羹吗