OC09_内存高级&集合

1.内存高级
新建一个Person类.
Person.h
@interface Person : NSObject

@property(nonatomic, retain)NSString *name;
@property(nonatomic, retain)NSString *sex;
@property(nonatomic, assign)NSUInteger age;
@property(nonatomic, retain)NSString *hobby;
@end


Person.m

- (void)dealloc
{
    // 当Person对象销毁时,把其成员一并release.
    [_sex release];
    [_name release];
    [_hobby release];
    [super dealloc];
}

// 标准setter方法,其中包含内存优化过程,在编程时可不写.
- (void)setName:(NSString *)name {
    // 第一种方法(适用于旧值比较多).
    // 当两个对象(地址)不是同一对象的时候.
    if (_name != name) {
        // 防止指针重指向的时候造成内存泄露.
        [_name release];
        // 防止野指针访问异常.
        _name = [name retain];

    // 第二种方法(适用于新值比较多).
    [name retain];
    [_name release];
    _name = name;


    }
}

- (void)setSex:(NSString *)sex {
    if (_sex != sex) {
        [_sex release];
        _sex = [sex retain];
    }
}

- (void)setAge:(NSUInteger)age {
    _age = age;
}

- (void)setHobby:(NSString *)hobby {
    if (_hobby != hobby) {
        [_hobby release];
        _hobby = [hobby retain];
    }
}

@end


main.m

Person *person = [[Person alloc] init];
NSString *name = [[NSString alloc] initWithString:@"梅西"];
NSString *name1 = [[NSString alloc] initWithString:@"C.罗"];

// setter方法.
[person setName:name];   // per.name = name;
[name release];
NSLog(@"%@", person.name);
(结果:梅西)   // 虽然name已经被释放,但是还是能打印结果.

[person setName:name1];
[name1 release];
[person setName:name1];   // 野指针访问异常.
NSLog(@"%@", person.name);
(结果:C.罗)   // 虽然name1已经被释放,但是还是能打印结果.


2.集合
// NSSet.
// collection 容器 (数组, 字典, 集合)
// 存储对象.
// 无序的.
// 集合元素必须唯一.

(1).
NSSet *set1 = [NSSet setWithObjects:@"a", @"b", @"b",@"b", nil];
NSLog(@"%@", set1);

结果:

(2). 打印元素个数.
NSLog(@"%ld", set1.count);
(结果:2).   // 应为元素集合必须唯一,重复的只打印一个.

(3). 获取某个元素.
NSLog(@"%@", [set1 anyObject]);
(结果:b).

(4). 是否包含.
if ([set1 containsObject:@"a"]) {
    NSLog(@"包含!~");
} else {
    NSLog(@"不包含!~");
}
(结果:包含!~).

3.可变集合.
NSMutableSet *set = [NSMutableSet set];
(1).添加元素.
[set addObject:@"R"];
[set addObject:@"T"];
[set addObject:@"Y"];
NSLog(@"%@", set);

添加结果

(2).移除.
[set removeObject:@"R"];
NSLog(@"%@", set);

移除结果

(3).NSCountedSet 计数集合.
NSCountedSet *countedSet = [NSCountedSet set];
[countedSet addObject:@"A"];
[countedSet addObject:@"A"];
[countedSet addObject:@"B"];
[countedSet addObject:@"C"];
NSLog(@"%@", countedSet);

计数结果

(4).获取对象加入集合的次数.
NSLog(@"%lu", [countedSet countForObject:@"A"]);

获取结果

(5).集合的遍历
for (NSString *temp in countedSet) {
    NSLog(@"%@", temp);
}

遍历的结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值