NSString对象的初始化和比较

深入理解Objective-C与Swift在iOS开发中的应用
本文详细探讨了Objective-C与Swift作为iOS开发首选语言的优势与局限,对比了两者在语法、性能、社区支持等方面的差异,并提供了实际案例以加深理解。

NSSting的对象在使用@"xx"直接初始化赋值时,它会在内存"stack segment"中分配一个空间,用于保存该变量。
相同赋值的对象,会采用相同的内存空间,表现为内存地址相同。

可以理解为NSString的isa的值是一样的。

    NSString *str2=@"e中国2";
    NSString *str3=@"e中国2";

 

    // %p for pointers to show the memory address
    NSLog(@"str2'addr is %p str3'addr is %p",str2,str3);


    if (str2 == str3)
    {
        NSLog(@"str2'pointer = str3's");
    }

    if ([str2 isEqualToString:str3])
    {
        NSLog(@"str2'content = str3's");
    }


使用stringWithFormat:工厂方法初始化NSString对象时,每次都独立分配内存空间。
我怀疑这个空间是在heap segment中,而不是stack segment中。   
即使相同内容的NSString对象,通过%d获取的对象的内存地址的值不一致。
   
    NSString *str2=[NSString stringWithFormat:@"e中国%i",2];
    NSString *str3=[NSString stringWithFormat:@"e中国%i",2];

 

   // %p for pointers to show the memory address
    NSLog(@"str2'addr is %p str3'addr is %p",str2,str3);



    if (str2 == str3)
    {
        NSLog(@"str2'pointer = str3's");
    }

    if ([str2 isEqualToString:str3])
    {
        NSLog(@"str2'content = str3's");
    }

NSString的比较方法,比较内容应该是isEqualToString:,比较指针的是==比较符号。通常情况下,你需要比较的都会是内容本身而不是其指针值。

### Objective-C 类对象初始化及其参数化方法 在 Objective-C 中,`init` 方法是最常见的对象初始化方式之一。通过 `alloc` `init` 的组合使用,可以创建并初始化一个对象[^2]。 #### 默认初始化 默认情况下,可以通过以下代码创建一个简单的对象: ```objc Person *person = [[Person alloc] init]; ``` 这段代码的作用是先通过 `alloc` 分配内存空间,再通过 `init` 方法完成对象初始化操作。 #### 带参数的初始化方法 如果需要在初始化过程中传递参数,则可以在子类中重写 `init` 方法或者定义新的初始化方法。例如: ##### 自定义初始化方法示例 假设有一个 `Person` 类,希望在初始化时设置 `name` `age` 属性,可以这样实现: ```objc #import <Foundation/Foundation.h> @interface Person : NSObject @property (nonatomic, strong) NSString *name; @property (nonatomic, assign) int age; // 自定义初始化方法 - (instancetype)initWithName:(NSString *)name andAge:(int)age; @end @implementation Person @synthesize name, age; - (instancetype)init { self = [super init]; if (self) { // 可以在这里进行其他通用的初始化逻辑 } return self; } - (instancetype)initWithName:(NSString *)name andAge:(int)age { self = [super init]; // 调用父类的初始化方法 if (self) { // 如果成功初始化 _name = name; // 设置属性值 _age = age; // 设置属性值 } return self; // 返回已初始化对象 } @end ``` 在这个例子中,`initWithName:andAge:` 是一个新的初始化方法,它允许我们在创建对象的同时传入 `name` `age` 参数[^1]。 #### 使用自定义初始化方法 当定义好带有参数的初始化方法后,就可以按照如下方式进行对象的创建初始化: ```objc Person *person = [[Person alloc] initWithName:@"Alice" andAge:30]; NSLog(@"Name: %@, Age: %d", person.name, person.age); ``` 这里调用了我们新定义的 `initWithName:andAge:` 方法,在创建对象的过程中直接设置了初始值。 #### 关于初始化方法的设计原则 为了提高程序的兼容性健壮性,通常建议遵循以下设计原则: 1. **始终调用超类的初始化方法**:在子类的初始化方法中,应首先调用 `[super init]` 或者其变体,确保父类的部分能够正常工作[^5]。 2. **验证输入参数的有效性**:在实际开发中,应对传入的参数进行必要的校验,防止非法数据引发错误行为。 3. **返回值检查**:即使是在现代编译器环境下,默认不会返回 `nil`,但仍需显式判断 `if (self)` 来增强代码的安全性。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值