1.类与对象(续)
1.1description(方法)
1.2属性
1.2.1关键字property自动生成,成员变量声明+setter(赋值)+getter(访问)
1.2.2.1nonatomic:线程不安全
1.2.2.2readonly:只生成成员变量的声明+getter(访问),不生成setter(赋值)
1.3初始化
1.3.1无参初始化:init方法是从NSObject类中继承过来的
1.3.2带参初始化:方法名的格式为:-(instancetype)initWith...
1.3.3instancetype:实例(对象)的数据类型
1.3.4id
1.3.4.1万能指针(数据类型的关键字)
1.3.4.2id数据类型定义指针时,不需要加*
1.3.4.3只能指向OC类的对象,不能指向基本数据类型或结构体类型的变量
1.3.4.4万能指针不能使用“.”操作属性,只能调用sette或getter方法
1.3.5self
1.3.5.1是一个指针(变量名)
1.3.5.2是一个局部变量,只能用在类中方法的函数体中
1.3.5.3在函数体中指向调用该方法的对象
1.3.5.4使用self的目的是在同一个方法的函数体中区分不同的对象属性
1.3.6super:是一个指针变量名
day12_04(无参初始化)
description类的标配.png#import "TRInteger.h"
@implementation TRInteger
-(instancetype)init
{
if(self = [super init])
{
self.integer = 10;
}
return self;
}//格式代码
-(NSString *)description//description一个类的标配
{
return [NSString stringWithFormat:@"%d",self.integer];
}
@end
#import "ViewController.h"
#import "TRInteger.h"
#import "TRPoint.h"
@interface ViewController ()
@property (weak, nonatomic) IBOutlet UILabel *outputLabel;
-(void)print:(id)obj;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
int a = 10;
TRInteger *i1 = [[TRInteger alloc] init];
[self print:i1];
TRPoint *p1 = [[TRPoint alloc] init];
[self print:p1];
}
-(void)print:(id)obj
{
self.outputLabel.text = [NSString stringWithFormat:@"%@",obj];
}
@end
带参初始方法需要声明day12_05(带参初始化)
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@interface TRInteger : NSObject
@property int integer;
-(instancetype)initWithInteger:(int)integer;//带参初始化需要声明
@end
NS_ASSUME_NONNULL_END
#import "TRInteger.h"
@implementation TRInteger
-(instancetype)init
{
if(self = [super init])
{
self.integer = 10;
}
return self;
}
-(instancetype)initWithInteger:(int)integer
{
self = [super init];
if(self)
{
self.integer = integer;
}
return self;
}
-(NSString *)description
{
return [NSString stringWithFormat:@"%d",self.integer];
}
@end
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@interface TRPoint : NSObject
@property int x,y;
-(instancetype)initWithX:(int)x andY:(int)y;
@end
NS_ASSUME_NONNULL_END
#import "TRPoint.h"
@implementation TRPoint
-(instancetype)init
{
self = [super init];
if(self)
{
self.x = 10;
self.y = 20;
}
return self;
}
-(instancetype)initWithX:(int)x andY:(int)y
{
self = [super init];
if(self)
{
self.x = x;
self.y = y;
}
return self;
}
-(NSString *)description
{
return [NSString stringWithFormat:@"(%d,%d)",self.x,self.y];
}
#import "ViewController.h"
#import "TRInteger.h"
#import "TRPoint.h"
@interface ViewController ()
@property (weak, nonatomic) IBOutlet UILabel *outputLabel;
-(void)print:(id)obj;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
TRInteger *i1 = [[TRInteger alloc]initWithInteger:10];
[self print:i1];
TRInteger *i2 = [[TRInteger alloc]initWithInteger:20];
[self print:i2];
TRPoint *p1 = [[TRPoint alloc]initWithX:10 andY:20];
[self print:p1];
TRPoint *p2 = [[TRPoint alloc]initWithX:30 andY:40];
[self print:p2];
}
-(void)print:(id)obj
{
self.outputLabel.text = [NSString stringWithFormat:@"%@",obj];
}
@end
关于id万能指针
#import "ViewController.h"
#import "TRInteger.h"
#import "TRPoint.h"
typedef struct
{
int I;
double d;
}Data;
@interface ViewController ()
@property (weak, nonatomic) IBOutlet UILabel *outputLabel;
-(void)print:(id)obj;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
id a;//a是一个万能指针,注意:前面不需要加*
TRInteger *f = [[TRInteger alloc] init];
a = f;//只能指向OC的对象
int b;
//a = &b;//不能指向基本数据类型的变量
// [self print:f];
// TRPoint *f1 = [[TRPoint alloc]initWithX:10 andY:20];
// [self print:f1];
Data data = {10 ,3.14};
//a = &data;//不能指向结构体类型的变量
f.integer = 20;
//a.integer = 30;//万能指针不能使用"."操作属性
[a setInteger:20];//只能调用setter或getter方法
self.outputLabel.text = [NSString stringWithFormat:@"%@",f];
}
练习二
练习二类.png
TRStudent.h
import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@interface TRStudent : NSObject
@property NSString *name;
@property int age;
@property int ID;
@property NSString *tr_address;
-(instancetype)initWithName:(NSString *)name AndAge:(int)age andID:(int)ID andAddress:(NSString *)tr_address;
@end
TRStudent.m
#import "TRStudent.h"
@implementation TRStudent
-(instancetype)init//无参初始化
{
self = [super init];
if(self)
{ self.name =@"张三";//[self setName:@"张三"];
self.age = 18;
self.ID = 1000;
self.tr_address = @"江苏南京";
}
return self;
}
-(instancetype)initWithName:(NSString *)name AndAge:(int)age andID:(int)ID andAddress:(NSString *)address//带参初始化
{
self = [super init];
if(self)
{
self.name = name;//带参的用形参来赋值与无参初始化的区别
self.age = age;
self.ID = ID;
self.tr_address = address;
}
return self;
}
-(NSString *)description
{
return [NSString stringWithFormat:@"\n姓名:%@\n年龄:%d\n学号:%d\n家庭住址:%@",self.name,self.age,self.ID,self.tr_address];
}
ViewController.m
@interface ViewController ()//叫扩展
@property (weak, nonatomic) IBOutlet UILabel *outputNameLabel;
@property (weak, nonatomic) IBOutlet UILabel *outputAgeLabel;
@property (weak, nonatomic) IBOutlet UILabel *outputIDLabel;
@property (weak, nonatomic) IBOutlet UILabel *outputAddressLabel;//weak弱指针,nonatomic表示线程不安全
-(void)print:(id)obj;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
TRStudent *stu1 = [[TRStudent alloc] init];
[self print:stu1];
TRStudent *stu2 = [[TRStudent alloc] initWithName:@"李四" AndAge:20 andID:1001 andAddress:@"广东深圳"];
[self print:stu2];
}
-(void)print:(id)obj
{
self.outputNameLabel.text = [obj name];
self.outputAgeLabel.text = [NSString stringWithFormat:@"%d",[obj age]];
self.outputIDLabel.text = [NSString stringWithFormat:@"%d",[obj ID]];
self.outputAddressLabel.text = [obj tr_address];
}
网友评论