Objective c 基本目标C

Objective c 基本目标C,objective-c,ios,oop,Objective C,Ios,Oop,释放“dict”是否会影响“name”?我的意思是,它也会取消分配“名字”吗?我在另一篇文章中看到,这是一种糟糕的做法?但是为什么呢 编辑:ARC被禁用。dict和NAME是两个不同的变量,不要混用 仅当您分配、复制、可变复制、保留时,“释放”。 否则,如果在自动释放模式下创建 如果您使用的是ARC,那么不需要“release”编译器就可以处理所有这些新分配的空间。dict和name是两个不同的变量,不要混合使用 仅当您分配、复制、可变复制、保留时,“释放”。 否则,如果在自动释放模式下创建 如

释放“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)用法之间的差异差异