Objective-C学习笔记

2019-06-17  本文已影响0人  苦苦修行

基于
Objective-C基础教程:1天玩转Objective-C语法
【C基础】#if、if、#ifdef、#if defined之间的区别
成员变量和属性区别(@property那点事儿)

#import <Foundation/Foundation.h>
//引入头文件
@interface Person : NSObject{
//声明成员变量(很少用,如果没有声明成员变量的话,可以省略大括号。)
}
//声明属性
@property int age;//基本数据类型(默认会生成对应的 set 和 get 方法。另外会默认生成对应的成员变量_age);语法规定,不能初始化
@property (NSString*) str;//对象类型或引用类型
//声明方法之类方法的创建(+号):
+(int)personWithA1:(float)a1 andA2:(NSString*)a2; //a1,a2分别代表两个参数
//声明方法之对象方法的创建(-号):
-(int)personWithA1:(float)a1 andA2:(NSString*)a2;
@end
#import "Person.h"
//引入头文件
@implementation Person
//对声明的方法进行实现
@end 
Person * obj1=[[Person alloc]init];
[obj1 personWithA1:1 andA2:@"对象方法"];//通过类对象调用
//.h 文件
#import <Foundation/Foundation.h>
@interface Person : NSObject
@property NSString * name;
@end
//.m 文件
#import "Person.h"
@implementation Person
@end 

完整实现:

//.h 文件
#import <Foundation/Foundation.h>
@interface Person : NSObject{
//编写习惯,一般声明成员变量的时候名字前面加“_”,同时也是为了和下边声明的name相对应。
NSString * _name;
}
@property NSString * name;//通过这行代码,OC底层隐式地声明了两个方法: set 和 get 方法
@end
//.m 文件
#import "Person.h"
@implementation Person
@synthesize name=_name;//将_name和name进行绑定;对在.h文件声明的get方法和set方法做实现
@end
  1. 有个比喻:对于weak来说,就相当于旁边看放风筝的人,他们只能用手指着你手里的风筝,大喊着“风筝风筝”,他们只能和你一起欣赏风筝,而对于是不是继续放风筝的决定权在你,如果你不在放风筝了,那他们也只能“各回各家,各找各妈”;
  2. 用OC的语言来表达,就是说用weak声明的属性虽然也可以访问内存,但是要在这块内存没有释放之前,一旦这块内存被释放之后,weak声明的属性将失去作用。
  1. 类别能够在原有类的基础上添加新的方法,而且还不会让子类继承。
  2. 类扩展能添加属性和方法,而类别只能添加方法

定义:

//Person+NewFuntion.h文件
#import "Person.h"
@interface Person (NewFuntion)
//添加方法
-(void)eat;
@end

实现:

#import "Person+NewFuntion.h"
@implementation Person (NewFuntion)
//实现方法
-(void)eat{
    NSLog(@"the person is eating!");
}
@end

使用:

#import <Foundation/Foundation.h>
#import "Person.h"
//一定要引入类别的接口文件,否则无法使用类别中添加的方法
#import "Person+NewFuntion.h"
int main(int argc, const char * argv[]) {
    Person * person=[[Person alloc] init];
    person.name=@"张三";
    person.age=10;
    [person run];
    //调用类别中增加的eat方法
    [person eat];
    return 0;
}

  1. 协议没有父类(协议可以服从多个(>=0)协议(一般服从NSObject协议)
  2. 协议中不能定义变量(属性),只能定义方法。
    声明一个协议:
@protocol ChildrenDelegate <NSObject>//协议声明
-(void)eat;
@end

声明一个符合此协议的对象属性

@interface Children : NSObject
@property(nonatomic,weak)id<ChildrenDelegate>delegete;//一个实现此协议的任意类型的对象属性
@end 

真正实现此协议的类

@interface Nanny : NSObject<ChildrenDelegate>
@end

综合使用:

int main(int argc, const char * argv[]) {
    Children  * child=[[Children alloc] init];
    Nanny * nanny=[[Nanny alloc] init];
    child.delegete=nanny;
    if ([child.delegete respondsToSelector:@selector(eat)]) {
        [child.delegete  eat];
    }
    return 0;
}

@selector(eat)返回 eat 方法的编号,它是个 SEL 类型

延申阅读:

上一篇下一篇

猜你喜欢

热点阅读