怎么c语言实现内存管理手动管理回收内存

在 SegmentFault,学习技能、解决问题
每个月,我们帮助 1000 万的开发者解决各种各样的技术问题。并助力他们在技术能力、职业生涯、影响力上获得提升。
问题对人有帮助,内容完整,我也想知道答案
问题没有实际价值,缺少关键内容,没有改进余地
在MRC下面,以几种方式生成NSString对象,打印它们的retainCount,但根据输出似乎都已经被释放,难道NSString是由系统自动进行管理,不需要手动去操作了?望有人能够解答,谢谢!
代码如下:
NSString *string1 = @"string 1";
NSString *string2 = [[NSString alloc] initWithString:@"string 2"];
NSString *string3 = [NSString stringWithFormat:@"string 3"];
NSString *string4 = [[NSString alloc] initWithFormat:@"string 4"];
NSLog(@"string1 count: %lu", (unsigned long)[string1 retainCount]);
NSLog(@"string2 count: %lu", (unsigned long)[string2 retainCount]);
NSLog(@"string3 count: %lu", (unsigned long)[string3 retainCount]);
NSLog(@"string4 count: %lu", (unsigned long)[string4 retainCount]);
结果输出:
15:44:26.281 MRC_Test[] string1 count:
15:44:26.281 MRC_Test[] string2 count:
15:44:26.281 MRC_Test[] string3 count:
15:44:26.281 MRC_Test[] string4 count:
输出格式什么的都没有问题,但是可以看到引用计数不是1,对象似乎被释放掉了。分别有四种创建方式,其中string1和string2是文字常量,不需要进行管理,那么暂且不论。而后面的string3和string4是创建在堆中,理应需要内存管理,但是结果不符合预期,望有人解答!
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
字符串在每个编程语言中都是一个特殊的梗,在OC中,字符串对象都只是一个指针,指向内存中字符串常量的指针,他不开辟空间的。所以,字符串的内层管理,都不需要开发者去管理,编译器会来处理的。
同步到新浪微博
分享到微博?
关闭理由:
删除理由:
忽略理由:
推广(招聘、广告、SEO 等)方面的内容
与已有问题重复(请编辑该提问指向已有相同问题)
答非所问,不符合答题要求
宜作评论而非答案
带有人身攻击、辱骂、仇恨等违反条款的内容
无法获得确切结果的问题
非开发直接相关的问题
非技术提问的讨论型问题
其他原因(请补充说明)
我要该,理由是:
在 SegmentFault,学习技能、解决问题
每个月,我们帮助 1000 万的开发者解决各种各样的技术问题。并助力他们在技术能力、职业生涯、影响力上获得提升。他的最新文章
他的热门文章
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)OC高级通讯录,使用内存手动进行管理.实现添加删除功能
//& main.m
//& Copyright (c) 2015年 and. All rights
#import "AddressBook.h"
#import "Person.h"
#import "NSString+Characters.h"
int main(int argc, const char * argv[])
@autoreleasepool {
测试类目的作用
NSString *str = @"hai";
NSString *str1 = [str uppercaseFireLet];
NSLog(@"%@",str1);
AddressBook *addressBook = [[AddressBook alloc] init];
Person *p1 = [Person personWithName:@"tongxing1" sex:@"女" age:21
phoneNum:@"123" ];
Person *p2 = [Person personWithName:@"tongxing2" sex:@"男" age:17
phoneNum:@"456"];
Person *p3 = [Person personWithName:@"tongxing3" sex:@"女" age:27
phoneNum:@"789"];
Person *p4 = [Person personWithName:@"Linda" sex:@"女" age:21
phoneNum:@"000"];
//& Person *p5 = [Person personWithName:@"xxx"
sex:@"男" age:22 phoneNum:@""];
NSLog(@"3-----------添加联系人");
if ([addressBook addPerson:p5]) {
//&&&&&&&&&&&
NSLog(@"%@ 添加成功。",p5);
//&&&&&&&&&&&
NSLog(@"%@ 添加失败。",p5);
if ([addressBook addPerson:p1]) {
&&&&&&&&&&&
NSLog(@"%@ 添加成功。",p1);
&&&&&&&&&&&
NSLog(@"%@ 添加失败。",p1);
if ([addressBook addPerson:p2]) {
&&&&&&&&&&&
NSLog(@"%@ 添加成功。",p2);
&&&&&&&&&&&
NSLog(@"%@ 添加失败。",p2);
if ([addressBook addPerson:p3]) {
&&&&&&&&&&&
NSLog(@"%@ 添加成功。",p3);
&&&&&&&&&&&
NSLog(@"%@ 添加失败。",p3);
if ([addressBook addPerson:p4]) {
&&&&&&&&&&&
NSLog(@"%@ 添加成功。",p4);
&&&&&&&&&&&
NSLog(@"%@ 添加失败。",p4);
[addressBook showPerson];
NSLog(@"4-----------根据电话查找联系人");
Person *findPhonePerson = [[Person alloc] init];
findPhonePerson = [addressBook
findPersonWithPhoneNum:@"456"];
NSLog(@"%@",findPhonePerson);
[findPhonePerson release];
findPhonePerson =
//5.要排序
NSLog(@"5-----------根据性别查找联系人并按年龄升序排序");
NSMutableArray *findSexArr = [NSMutableArray
arrayWithArray:[addressBook findPersonsWithSex:@"女"] ];
for (Person *tmp in findSexArr) {
&&&&&&&&&&&
NSLog(@"%@",tmp);
NSLog(@"6-----------根据姓名修改联系人信息");
if ([addressBook changePersonWithName:@"Linda" phoneNum:@"012"
sex:@"女" age:25]) {
&&&&&&&&&&&
NSLog(@"添加Linda成功。");
&&&&&&&&&&&
NSLog(@"修改Linda失败。");
NSLog(@"7-----------根据姓名删除联系人,并展示");
if ([addressBook deletePersonWithName:@"Baby"]) {
&&&&&&&&&&&
NSLog(@"删除Baby成功。");
&&&&&&&&&&&
NSLog(@"删除Baby失败。");
[addressBook showAll];
//[addressBook showPerson];
NSLog(@"8-----------删除一个分组,并展示");
if ([addressBook deleteGroup:@"L"]) {
&&&&&&&&&&&
NSLog(@"删除L组成功。");
&&&&&&&&&&&
NSLog(@"删除L组失败。");
[addressBook showAll];
//[p1 release];
//[p2 release];
//[p3 release];
//[p4 release];
[addressBook release];
addressBook =
&&& return
//& NSString+Characters.h
//& Copyright (c) 2015年 tongxing. All rights
@interface NSString (Characters)
-(NSString *)uppercaseFireL
//& NSString+Characters.m
//& Copyright (c) 2015年 tongxing. All rights
#import "NSString+Characters.h"
@implementation NSString (Characters)
-(NSString *)uppercaseFireLet{
&&& NSString
*string = [[self substringToIndex:1]capitalizedString];
&&& return
//& AddressBook.h
//& Copyright (c) 2015年 and. All rights
@interface AddressBook : NSObject
@property(nonatomic,retain)NSMutableDictionary *addressB
- (instancetype)
- (BOOL)addPerson:(Person *)aP
- (BOOL)deletePersonWithName:(NSString *)aPersonN
- (BOOL)deleteGroup:(NSString *)aGroupN
- (Person *)findPersonWithPhoneNum:(NSString *)aPhoneN
- (NSArray *)findPersonsWithSex:(NSString *)aS
- (BOOL)changePersonWithName:(NSString *)name phoneNum:(NSString
*)aNum sex:(NSString *)aSex age:(NSUInteger)aA
- (void)showA
- (void) showP
//& AddressBook.m
//& Copyright (c) 2015年 and. All rights
#import "AddressBook.h"
#import "Person.h"
#import "pinyin.h"
#import "NSString+Characters.h"
@implementation AddressBook
- (instancetype)init
&&& if (self =
[super init]) {
NSMutableDictionary *mDict = [NSMutableDictionary
dictionary];
self.addressBook = [mDict retain];
[mDict release];
&&& return
- (void)dealloc
&&& [super
//添加联系人,姓名或电话为空则返回NO
//判断是否已存在分组,不存在则创建
//联系人不能重名
- (BOOL)addPerson:(Person *)aPerson
(aPerson.name != nil && aPerson.phoneNum != nil )
{//判断重名
for (Person *p in _addressBook[) {//[aPerson.name
uppercasePinYinFirstLetter]
//&&&&&&&&&&&
if ([p.name isEqualToString:aPerson.name]) {
//&&&&&&&&&&&&&&&
return NO;
//&&&&&&&&&&&
for (Person *p in [_addressBook objectForKey:[aPerson.name
uppercaseFireLet]]) {//[aPerson.name
uppercasePinYinFirstLetter]
&&&&&&&&&&&
if ([p.name isEqualToString:aPerson.name]) {
&&&&&&&&&&&&&&&
return NO;
&&&&&&&&&&&
NSString *firstChar = [aPerson.name
uppercasePinYinFirstLetter];//取首字母
if (_addressBook[firstChar] == nil) {//无分组
&&&&&&&&&&&
NSMutableArray *tmpGroup = [NSMutableArray
arrayWithObject:aPerson];
&&&&&&&&&&&
[_addressBook setObject:tmpGroup forKey:firstChar];
}else {//已有分组
&&&&&&&&&&&
[_addressBook[firstChar] addObject:aPerson];
return YES;
return NO;
//根据姓名删除联系人
- (BOOL)deletePersonWithName:(NSString *)aPersonName
(NSString *strKey in _addressBook) {
NSArray *arr = _addressBook[strKey];
for (Person *p in arr) {
&&&&&&&&&&&
if ([p.name isEqualToString:aPersonName]) {
&&&&&&&&&&&&&&&
[_addressBook[[aPersonName uppercaseFireLet]]
removeObject:p];
&&&&&&&&&&&&&&&
if ([arr count] == 1) {//如果分组为空,则删除字典中分组
&&&&&&&&&&&&&&&&&&&
[self deleteGroup:[aPersonName uppercaseFireLet]];
&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&
return YES;
&&&&&&&&&&&
&&& return
//根据分组名删除分组
- (BOOL)deleteGroup:(NSString *)aGroupName
(_addressBook[aGroupName] != nil) {
[_addressBook removeObjectForKey:aGroupName];
return YES;
&&& }else{
return NO;
//根据电话号码查找联系人,返回联系人
- (Person *)findPersonWithPhoneNum:(NSString *)aPhoneNum
(NSString *strKey in _addressBook ) {//遍历字典中key值
NSArray *arr = _addressBook[strKey];//通过key值取出数组
for (Person *p in arr) {//遍历数组
&&&&&&&&&&&
if ([p.phoneNum isEqualToString:aPhoneNum]) {
&&&&&&&&&&&&&&&
&&&&&&&&&&&
&&& return
//根据性别查找联系人,并排序,返回获取的数组
- (NSArray *)findPersonsWithSex:(NSString *)aSex
&&& NSArray
*fArr = [NSArray array];
(NSString *strKey in _addressBook) {
NSArray *arr = _addressBook[strKey];
for (Person *p in arr) {
&&&&&&&&&&&
if ([p.sex isEqualToString:aSex]) {
&&&&&&&&&&&&&&&
fArr = [fArr arrayByAddingObject:p];
&&&&&&&&&&&
&&& fArr = [fArr
sortedArrayUsingComparator:^NSComparisonResult(Person *obj1, Person
if([obj1.phoneNum compare:obj2.phoneNum] ==
NSOrderedDescending){
&&&&&&&&&&&
return NSOrderedD
}else if([obj1.phoneNum
compare:obj2.phoneNum]==NSOrderedSame){
&&&&&&&&&&&
return NSOrderedS
&&&&&&&&&&&
return NSOrderedA
&&& return
//根据姓名修改联系人信息
- (BOOL)changePersonWithName:(NSString *)name phoneNum:(NSString
*)aNum sex:(NSString *)aSex age:(NSUInteger)aAge
&&& if (aNum !=
nil && aSex != nil && aAge != 0) {
for (NSString *strKey in _addressBook) {
&&&&&&&&&&&
NSArray *arr = _addressBook[strKey];
&&&&&&&&&&&
for (Person *p in arr) {
&&&&&&&&&&&&&&&
if ([p.name isEqualToString:name]) {
&&&&&&&&&&&&&&&&&&&
p.phoneNum = aN
&&&&&&&&&&&&&&&&&&&
p.sex = aS
&&&&&&&&&&&&&&&&&&&
p.age = aA
&&&&&&&&&&&&&&&&&&&
return YES;
&&&&&&&&&&&&&&&
&&&&&&&&&&&
&&& return
//显示所有联系人
- (void)showAll
(NSString *strKey in _addressBook) {
NSArray *arr = _addressBook[strKey];
for (Person *p in arr) {
&&&&&&&&&&&
NSLog(@"%@",p);
- (void) showPerson
NSLog(@"%@",_addressBook);
//& Person.h
//& Copyright (c) 2015年 and. All rights
@interface Person : NSObject
@property(nonatomic,retain)NSString *
@property(nonatomic,retain)NSString *
@property(nonatomic,assign)NSUI
@property(nonatomic,retain)NSString *phoneN
- (instancetype) initWithName:(NSString *)name sex:(NSString *)sex
age:(NSUInteger)age phoneNum:(NSString *)phoneN
+ (id) personWithName:(NSString *)name sex:(NSString *)sex
age:(NSUInteger)age phoneNum:(NSString *)phoneN
- (NSString *)
//& Person.m
//& Copyright (c) 2015年 and. All rights
#import "Person.h"
@implementation Person
@synthesize name = _
@synthesize sex = _
@synthesize age = _
@synthesize phoneNum = _phoneN
- (void)dealloc
&&& [_name
&&& [_phoneNum
&&& [super
- (instancetype) initWithName:(NSString *)name sex:(NSString *)sex
age:(NSUInteger)age phoneNum:(NSString *)phoneNum
&&& if (self =
[super init]) {
self.name =
self.sex =
self.age =
self.phoneNum = phoneN
&&& return
+ (id) personWithName:(NSString *)name sex:(NSString *)sex
age:(NSUInteger)age phoneNum:(NSString *)phoneNum
&&& Person *p =
[[Person alloc] initWithName:name sex:sex age:age
phoneNum:phoneNum];
&&& return [p
autorelease];
- (NSString *) description
&&& return
stringWithFormat:@"姓名:%@\t性别:%@\t年龄:%lu\t电话:%@",_name,_sex,_age,_phoneNum];
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。推荐这篇日记的豆列
&&&&&&&&&&&&
&(1人关注)他的最新文章
他的热门文章
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)}

我要回帖

更多关于 java 手动管理内存 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信