IOS学习笔记——object-C基础 (一)

我是搞android的,公司IOS的跑路然后我去顶缸,看了一个多礼拜语法立马上岗了基础方面还是比较薄弱的。公司搞培训买了课程不看白不看,然后做做笔记拾遗补漏。

IIOS学习笔记——object-C基础 (一)_第1张图片

先看下ios的结构图吧,看看就好了解下。

关于#import xxxxx;#include xxxxx;都用import吧避免多次引入。

关于

@property 是声明属性的语法 :

  1. @property NSString* firstName;
上一行代码会生成firstName属性,同时默认会生成一个实例变量_firstName,以及它的存取器getter、setter方法。


还有一个@synthesize 是合成某一属性对应的实例变量

举个例子:

  1. @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的只是类内部应用的。

关于堆栈:

IOS学习笔记——object-C基础 (一)_第2张图片


结构体之间的拷贝和类之间的拷贝如下图:

IOS学习笔记——object-C基础 (一)_第3张图片


类拷贝的是指针。


关于栈,不同的函数不同的栈。

关于结构和类做为参数方法调用的时候:

IOS学习笔记——object-C基础 (一)_第4张图片

IOS学习笔记——object-C基础 (一)_第5张图片



关于类的属性描述:

IOS学习笔记——object-C基础 (一)_第6张图片

为了解决#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);

"-"标注的是实例方法,要具体的实例调用;“+”标注的是类方法,通过类调用。

方法的调用机制:

IOS学习笔记——object-C基础 (一)_第7张图片

  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];
他们是等价的。

类初始化器无法手动调用,第一次使用类的时候自动调用。实例对象的析构器也无法手动调用。

子类调用父类的实例用->。






你可能感兴趣的:(IOS学习笔记——object-C基础 (一))