Objective c 基本目标C
释放“dict”是否会影响“name”?我的意思是,它也会取消分配“名字”吗?我在另一篇文章中看到,这是一种糟糕的做法?但是为什么呢Objective c 基本目标C,objective-c,ios,oop,Objective C,Ios,Oop,释放“dict”是否会影响“name”?我的意思是,它也会取消分配“名字”吗?我在另一篇文章中看到,这是一种糟糕的做法?但是为什么呢 编辑:ARC被禁用。dict和NAME是两个不同的变量,不要混用 仅当您分配、复制、可变复制、保留时,“释放”。 否则,如果在自动释放模式下创建 如果您使用的是ARC,那么不需要“release”编译器就可以处理所有这些新分配的空间。dict和name是两个不同的变量,不要混合使用 仅当您分配、复制、可变复制、保留时,“释放”。 否则,如果在自动释放模式下创建 如
编辑:ARC被禁用。dict和NAME是两个不同的变量,不要混用 仅当您分配、复制、可变复制、保留时,“释放”。 否则,如果在自动释放模式下创建
如果您使用的是ARC,那么不需要“release”编译器就可以处理所有这些新分配的空间。dict和name是两个不同的变量,不要混合使用 仅当您分配、复制、可变复制、保留时,“释放”。 否则,如果在自动释放模式下创建
如果您使用的是ARC,那么不需要“release”编译器就可以处理所有这些新分配的空间。因为您是手动调用release,所以我假设您没有使用自动引用计数(ARC) 这里有些术语混淆了 它不会取消分配
名称
。调用release时,您正在减少dict的引用计数。一旦引用计数达到0,内存将被释放
问题是您没有首先调用dict
上的retain
,就将dict
分配给了names
保留对象会增加其引用计数
您可以选择将*names
作为一个属性,该属性将为您处理内存管理,也可以通过调用retain手动增加引用计数:names=[dict retain]代码>
如果您这样做,您还必须在dealloc方法中实现dealloc
方法和release
names
。由于您手动调用release,我假设您没有使用自动引用计数(ARC)
这里有些术语混淆了
它不会取消分配名称
。调用release时,您正在减少dict的引用计数。一旦引用计数达到0,内存将被释放
问题是您没有首先调用dict
上的retain
,就将dict
分配给了names
保留对象会增加其引用计数
您可以选择将*names
作为一个属性,该属性将为您处理内存管理,也可以通过调用retain手动增加引用计数:names=[dict retain]代码>
如果执行此操作,还必须在解除锁定方法内实现dealoc
方法和release
names
。您的代码使用dict
值分配names
dict
是指向一个对象的指针,因此当您将其值指定给另一个指针(names
)时,两个指针都引用同一个对象,可以认为是相同的
因此,是的,当您发布dict
时,您也在发布名称
顺便说一句,您可以直接分配给名称
,而无需通过dict
:
@implementation GroupedInexedViewController
{
NSDictionary *names;
}
- (void)viewDidLoad
{
[super viewDidLoad];
NSString *path = [[NSBundle mainBundle] pathForResource:@"PropertyList"
ofType:@"plist"];
NSDictionary *dict = [[NSDictionary alloc] initWithContentsOfFile:path];
names = dict;
[dict release];
}
如果可以启用ARC,则无需担心释放对象。您的代码将名称赋值为dict
dict
是指向一个对象的指针,因此当您将其值指定给另一个指针(names
)时,两个指针都引用同一个对象,可以认为是相同的
因此,是的,当您发布dict
时,您也在发布名称
顺便说一句,您可以直接分配给名称
,而无需通过dict
:
@implementation GroupedInexedViewController
{
NSDictionary *names;
}
- (void)viewDidLoad
{
[super viewDidLoad];
NSString *path = [[NSBundle mainBundle] pathForResource:@"PropertyList"
ofType:@"plist"];
NSDictionary *dict = [[NSDictionary alloc] initWithContentsOfFile:path];
names = dict;
[dict release];
}
如果您可以启用ARC,您就不必担心释放对象。简而言之,如果您不使用ARC,是的:释放dict
将影响名称。这是因为您正在将名称
指针分配给已分配的单个NSDictionary
如果您想在解除锁定dict
时让名称
保留NSDictionary
,则需要发送dict
一条retain
消息:
names = [[NSDictionary alloc] initWithContentsOfFile:path];
简言之,如果您不使用ARC,是:取消分配dict
将影响名称。这是因为您正在将名称
指针分配给已分配的单个NSDictionary
如果您想在解除锁定dict
时让名称
保留NSDictionary
,则需要发送dict
一条retain
消息:
names = [[NSDictionary alloc] initWithContentsOfFile:path];
到目前为止,似乎没有任何答案提及ARC和非ARC(MRC)用法之间的差异以及属性和实例变量之间的差异
首先,属性实际上只是由实例变量支持的setter和getter方法。当您设置一个属性,如self.dict=someObject
并将属性声明为strong
或retain
,然后保留someObject
然而,如果您只有一个实例变量(而不是属性),并且您正在使用MRC,那么只需编写dict=someObject
仅复制指针,但不增加引用计数-如果在此之后写入[someObject release]
,则应假定dict
也无效(即使这两个指针指向的对象未实际解除分配-这是引用计数规则)
如果使用ARC,那么赋值给变量也会增加引用计数1-因此,如果someObject
的引用计数为1,则写入dict=someObject
会将对象的引用计数(现在由dict
和someObject
指向)增加到2。到目前为止,似乎没有回答提到ARC和非ARC(MRC)用法之间的差异和差异