我是搞android的,公司IOS的跑路然后我去顶缸,看了一个多礼拜语法立马上岗了基础方面还是比较薄弱的。公司搞培训买了课程不看白不看,然后做做笔记拾遗补漏。
先看下ios的结构图吧,看看就好了解下。
关于#import xxxxx;#include xxxxx;都用import吧避免多次引入。
关于
@property 是声明属性的语法 :
还有一个@synthesize 是合成某一属性对应的实例变量
举个例子:
在这行代码的作用下,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];他们是等价的。
类初始化器无法手动调用,第一次使用类的时候自动调用。实例对象的析构器也无法手动调用。
子类调用父类的实例用->。