我是搞android的,公司IOS的跑路然后我去顶缸,看了一个多礼拜语法立马上岗了基础方面还是比较薄弱的。公司搞培训买了课程不看白不看,然后做做笔记拾遗补漏。
I
先看下ios的结构图吧,看看就好了解下。
关于#import xxxxx;#include xxxxx;都用import吧避免多次引入。
关于
@property 是声明属性的语法 :
- @property NSString* firstName;
还有一个@synthesize 是合成某一属性对应的实例变量
举个例子:
- @synthesize firstName = xName;
在这行代码的作用下,firstName属性所生成的、访问的成员变量不再是之前默认的_firstName,而是xName。
现在一般不用@synthesize了。用@property就够了。
类分.h文件和对应的.m文件;结构体只有.h文件。
结构体如SPoint.h
typedef struct {
int x;
int y;
} SPoint;
类如
RPoint.h和
RPoint.m
RPoint.h
@interface RPoint: NSObject
@property int x; //状态
@property int y; //状态
-(void) print; //行为
@end
.h里面的东西外部都可以用的,是类和外部交流的通道
RPoint.m
#import <Foundation/Foundation.h>
#import "rpoint.h"
@implementation RPoint
-(void) print{
NSLog(@"[%d, %d]", self.x, self.y);
}
@end
.m的只是类内部应用的。
关于堆栈:
结构体之间的拷贝和类之间的拷贝如下图:
类拷贝的是指针。
关于栈,不同的函数不同的栈。
关于结构和类做为参数方法调用的时候:
关于类的属性描述:
为了解决#import的循环依赖问题,可以用@class解决,例如Employee类依赖WorkItem类,WorkItem类依赖Employee类,两个都需要写入@class 依赖类 如:
#import <Foundation/Foundation.h>
#import "Employee.h"
@class Employee;
@interface WorkItem : NSObject
@property (copy) NSString * content;
@property int term;
@property (weak) Employee * owner;
@end
全局函数概念
#import <Foundation/Foundation.h>
int sum(int a, int b);
@interface BLNPoint : NSObject
@property int x;
@property int y;
-(void) print;
-(BOOL) isEqualToPoint: (BLNPoint*) point;
-(void) moveToX:(int)x toY:(int)y;
+(BLNPoint*) getOriginPoint;
@end
上面
BLNPoint.h的sum就是全局函数,引入了BLNPoint.h就可以直接用比如int value=sum(10,20);
"-"标注的是实例方法,要具体的实例调用;“+”标注的是类方法,通过类调用。
方法的调用机制:
id obj=[[NSString alloc] init];
[obj moveToX:50 toY:60];
[obj print]; //JMP obj-> methodLists-> &print
[obj setX:70];
[obj setY:80];
[obj print];
对象初始化器
#import <Foundation/Foundation.h>
@interface Book : NSObject
@property (copy) NSString *name;
@property int pages;
@property (copy) NSString *category;
-(id)init;//对象初始化器,前置调用父类的初始化器
-(id)initWithName:(NSString *)name;//对象初始化器
-(id)initWithName:(NSString *)name WithPages:(int)pages;//对象初始化器
-(id)initWithName:(NSString *)name WithPages:(int)pages WithCategory:(NSString*)category;//对象初始化器
-(void)print;
-(void)dealloc;//只有一个的对象析构器,没有类初始化器。有继承的话是后置调用父类的析构器。
+(void)initialize;//类初始化器@end
举个实例初始化器的写法例子:
-(id)initWithName:(NSString *)name WithPages:(int)pages WithCategory:(NSString*)category
{
self = [super init];//不管三七二十一先上这句,然后判断有没成功
if (self) {
NSLog(@"Book Object init");
_name = [name copy];//初始化内部用实例变量,不要用self
_pages = pages;
_category = [category copy];//copy就是拷贝堆的一份数据再用指针指向它
}
return self;
}
有时候能看到这种情况:
Book *b1 = [[Book alloc]init];
Book *b2 = [Book new];
他们是等价的。
类初始化器无法手动调用,第一次使用类的时候自动调用。实例对象的析构器也无法手动调用。
子类调用父类的实例用->。