main函数的一些操作

系列文章目录

第一章 OC之单例模式
第二章 OC之对象初始化
第三章 OC之类和协议
第四章 OC之main函数中的操作和一些概念



前言

本篇介绍OC中关于mian函数的一些操作和一些概念

一、main函数的一些操作

#import"XiyouMobilePerson.h"
#import"Model.h"
#import"XiyouMobilePerson.h"
#import<Foundation/Foundation.h>
NSString* NSCollectionToString (NSArray* array) {
    NSMutableString* result = [NSMutableString
                               stringWithString: @"["];
    for (id obj in array) {
        [result appendString:[obj description]];
        [result appendString:@","];
    }
    NSUInteger len = [result length];
    [result deleteCharactersInRange : NSMakeRange (len-2, 2)];
    return result;
}
int main() {
    @autoreleasepool {
        XiyouMobilePerson* p1 = [[XiyouMobilePerson alloc]init];
        [p1 setiOS : 99];
        XiyouMobilePerson* p2 = [[XiyouMobilePerson alloc]init];
        [p2 setiOS : 97];
        XiyouMobilePerson* p3 = [[XiyouMobilePerson alloc]init];
        [p3 setiOS : 95];
        XiyouMobilePerson* p4 = [[XiyouMobilePerson alloc]init];
        [p4 setiOS : 93];
        XiyouMobilePerson* p5 = [[XiyouMobilePerson alloc]init];
        [p5 setiOS : 91];
        Model* m = [[Model alloc]init];
        m.XiyouMobileArrey = [NSMutableArray arrayWithArray: @[p1,p2,p3,p4,p5]];
        NSLog(@"%d %d %d %d %d", [p1 getiOS], [p2 getiOS], [p3 getiOS], [p4 getiOS], [p5 getiOS]);
        NSMutableArray* a = [m.XiyouMobileArrey sortedArrayUsingComparator : ^(id obj1, id obj2){
            if ([obj1 getiOS] > [obj2 getiOS]) {
                return NSOrderedDescending;
            }
            if ([obj1 getiOS] < [obj2 getiOS]) {
                return NSOrderedAscending;
            }
            return NSOrderedSame;
        }
        ];
        NSLog(@"%d", [a[4] getiOS]);
}
}

结果:
在这里插入图片描述

二 属性和成员变量

使用@property声明一个成员变量时,会自动为其分配setter,getter方法。那么属性和成员变量有什么区别呢?

@property(nonatomic,copy)NSString* num;

当我们这样定义一个属性时,系统会自动为其分配一个_num的成员变量,并且系统会自动为其分配setter,getter方法,我们在.m文件中不仅可以直接使用_num的值,还可以通过self.num来访问这个属性。

那成员变量是怎样的?

//成员变量的声明
@interface XXXXXX{
	NSString* num;
}
//属性的定义
@property (nonatomic,copy)NSString* name;
@end;
//
@implementation.  

属性对应的,一定有setter,getter方法,主要是对成员变量赋值,取值的。而成员变量,真的只是一个变量。

三 ==和isEqual

它们两个都是用来判断值是否相等的方法。(==是运算符,isEqual是方法)

==

使用==来判断两个变量是否相等时,如果两个变量是基本类型的变量,则值相同即返回真,如果是指针类型的变量,只有它们指向同一个地址时才返回真。

注意使用==来判断时有字符串长度和内容和字符串类型的不同会产生不同结果。可见此博客的5.6部分

isEqual

使用isEqual来判断两个变量是否相等时,只要它们的字符串序列相等即返回真。

四 分类和拓展

分类不能添加属性,拓展可以添加属性

分类

分类是用于给原有类添加方法的,因为分类的结构体指针中,没有属性列表,只有方法列表。所以原则上它只能添加方法不能添加属性(成员变量),实际上可以通过其他方法来添加属性
分类中可以写@property,因为分类中没有属性列表,不会自动生成setter/getter方法,也不会生成实现以及私有的成员变量。(编译时会警告)
同名方法的调用优先级:分类>子类>父类
如果多个分类中都有和原有类方法同名的方法,那么调用该方法的时候执行谁由编译器决定。编译器会执行最后一个参与编译的方法。

拓展

拓展是分类的一个特例,拓展和分类相比只缺少了分类的名称,所以称之为“匿名分类”
拓展中的私有属性和私有方法必须实现

区别

类别原则上只能添加方法(添加属性需要解决无setter/getter方法的问题)
扩展可以添加方法和属性和实例变量,实例变量默认是@private
类别中的方法可以不实现,但是扩展中的方法必须实现,否则会警告。

五 NSString的三种类型

类型:

  1. _NSCFConstantString
  2. _NSCFString
  3. NSTaggedPointerString

1._NSCFConstantString

指一种常量字符串,是一种编译时的常量。存储在字符常量区。是一种创建后便无法释放掉的对象。给不同对象创建内容相同的字符串时,它不会被重复创建

NSString* str = @"hello";

当我们这样创建字符串时,它的类型就是_NSCFConstantString

2._NSCFString

一种在运行时创建的NSString子类,它并不是一种字符串常量,所以和其他对象一样在创建时获得了1的引用计数。
如果字符串长度满足要求,不论其创建方式,都会呢被创建成为_NSCFString类型

NSString* str = [NSStringt stringWithFormat:@"hello world"];

这样创建字符串时,它的类型就是_NSCFString

3.NSTaggedPointerString

理解这个类型,需要明白什么是标签指针,这是苹果在64位环境下对NSString,NSNumber等对象做的优化
把指针指向的内容直接放在了指针变量的内存地址中
这个也是一个释放不掉的单例常量对象。如果我们使用不同的字符串对象进行创建,内容相同时,地址也相同。
对于NSString对象来说,当非字面值常量的数字,英文字母字符串的长度小于9时(含有q小于7),会自动成为NSTaggedPointerString类型。

NSString* str = [NSStringt stringWithFormat:@"hello"];

这个字符串的类型就是NSTaggedPointerString

六 深浅拷贝

1.常见的字符串的深浅复制

浅复制:

对于浅复制而言,在内存中复制了两个对象,这两个对象的指针变量会指向同一个对象,也就是两个对象依然存在公用的部分。

深复制:

深复制不仅会复制对象本身,而且会递归复制每个指针类型的实例变量。直到两个对象没有任何共用的部分

关于深浅复制的内容可见此博客

2.容器类完全深拷贝

容器类调用copy或者mutableCopy能出现深拷贝的情况下,只是容器的深拷贝,不是容器内容的深拷贝。

那么容器类的完全深拷贝怎样实现呢?

NSDictionary Dict = [[NSDictionary alloc]initWithDictionry:someDictionary copyItems:YES];
NSArray* Array = [NSKeyedUnarchiver unarchiveObjectWithData:[NSKeyedArchiver archiverDataWithRootObject:oldArray]];
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

山河丘壑

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值