【Objective-C】结构体和类的区别
原创
©著作权归作者所有:来自51CTO博客作者后端码匠的原创作品,请联系作者获取转载授权,否则将追究法律责任
一、结构体只能封装属性,而类不仅可以封装属性还可以封装方法.
如果1个封装数据既有属性也有行为,只能用类.
二、结构体变量分配在栈.OC对象分配在堆.
栈的空间相对较小.但是存储在栈中的数据访问效率相对较高.
堆的空间相对较大.但是存储在堆中的数据的访问效率相对较低.
如果1个封装数据只有属性.如果用结构体就会分配在栈 效率就会高.
如果使用类型 对象就分配在堆 效率相对就会低.
如果定义1个结构体,这个结构体中有很多个属性.那么这个时候结构体变量在栈中就会占据很大1块空间 反而会降低效率.
什么时候使用结构体:
1. 封装数据只有属性 2. 属性较少(3个以下).
什么时候使用类:
1 .封装数据既有属性也有行为. 2 .只有属性 但是属性较多.
三、结构体赋值是 直接赋值的值. 而对象的指针 赋值的是对象的地址.
//
// StructPractice.h
// OneLiveIOS
//
// Created by Inke219223m on 2022/5/26.
//
#import <Foundation/Foundation.h>
struct Books {
NSString *title;
NSString *author;
NSString *subject;
int book_id;
};
//位域
//位字段允许在结构中打包数据。当内存或数据存储非常宝贵时,这尤其有用。
//struct codingce_struct {
// unsigned int f1:1;
// unsigned int f2:1;
// unsigned int f3:1;
// unsigned int f4:1;
// unsigned int type:4;
// unsigned int my_int:9;
//} codingce;
//将多个对象打包成机器字。 例如 可以压缩1位标志。读取外部文件格式 - 可以读入非标准文件格式。9位整数。
struct codingce_struct {
unsigned int f1:1;
unsigned int f2:1;
unsigned int f3:1;
unsigned int f4:1;
unsigned int type:4;
unsigned int my_int:9;
};
NS_ASSUME_NONNULL_BEGIN
@interface StructPractice : NSObject
-(void) StructFunTest : (int) num1;
-(void) PrintStruct : (int) num1 : (struct Books) book;
//
// StructPractice.m
// OneLiveIOS
//
// Created by Inke219223m on 2022/5/26.
//
#import "StructPractice.h"
@implementation StructPractice
-(void) StructFunTest : (int) num1 {
struct Books Book1; /* 声明Book类型变量:Book1 */
struct Books Book2;
Book1.title = @"我是幸运的";
Book1.author = @"封神榜";
Book1.subject = @"Objective-C编程教程";
Book1.book_id = 81234566;
Book2.title = @"Java";
Book2.author = @"Maxsu";
Book2.subject = @"C编程教程";
Book2.book_id = 813283488;
/* 打印 Book1 信息 */
NSLog(@"Book 1 title : %@\n", Book1.title);
NSLog(@"Book 1 author : %@\n", Book1.author);
NSLog(@"Book 1 subject : %@\n", Book1.subject);
NSLog(@"Book 1 book_id : %d\n", Book1.book_id);
/* 打印 Book2 信息 */
NSLog(@"Book 2 title : %@\n", Book2.title);
NSLog(@"Book 2 author : %@\n", Book2.author);
NSLog(@"Book 2 subject : %@\n", Book2.subject);
NSLog(@"Book 2 book_id : %d\n", Book2.book_id);
[self PrintStruct: 2 : Book1];
struct Books *struct_pointer;
struct_pointer = &Book1;
NSLog(@"指向结构的指针:%@", struct_pointer->title);
}
-(void) PrintStruct : (int) num1 : (struct Books) book {
NSLog(@"book title : %@\n", book.title);
NSLog(@"book author : %@\n", book.author);
NSLog(@"book subject : %@\n", book.subject);
NSLog(@"book book_id : %d\n", book.book_id);
}