Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios Objective-C中的性质_Ios_Objective C_Memory Management_Synthesize - Fatal编程技术网

Ios Objective-C中的性质

Ios Objective-C中的性质,ios,objective-c,memory-management,synthesize,Ios,Objective C,Memory Management,Synthesize,问题1: 如果我遵循第7行,一切都很好,如果我使用第9行,内存泄漏是存在的。正如我所知,self指向当前对象,如果我使用self.object或简单地使用object则没有更多区别 问题2:如果我使用 Line 1: First.h Line 2: @property (nonatomic, retain) NSString *name; Line 3: First.m Line 4: @synthesize name; Line 5: -(void)viewDidLoad() Line

问题1:
如果我遵循第7行,一切都很好,如果我使用第9行,内存泄漏是存在的。正如我所知,self指向当前对象,如果我使用
self.object
或简单地使用
object
则没有更多区别

问题2:如果我使用

Line 1: First.h
Line 2: @property (nonatomic, retain) NSString *name;

Line  3: First.m
Line  4: @synthesize name;
Line  5: -(void)viewDidLoad()
Line  6: {
Line  7:     name = [NSString stringWithString:@"Hello"];
Line  8:                          OR
Line  9:     self.name = [[NSString alloc]initWithString:@"Hello"]; 
Line 10:                          OR
Line 11:  }
Line 12:-(void)dealloc()
Line 13: {
Line 14: [name release];
Line 14: } 
那么,哪一个用于设置name的值,哪一个用于获取该值?两者之间的区别:

@synthesize name = _name;
问题3:

如果我创建了任何属性,是否需要在我分配的内存中分配alloc以显示内存泄漏?

回答第一个问题:
alloc
方法初始化字符串时,保留创建的对象,但之后不释放对象,因此出现泄漏,使用
stringWithString
创建字符串时,您会得到一个自动释放的对象,该对象由自动释放池自动释放。请注意,在第9行的示例中,您正在初始化对象并将其传递给属性的setter,如果使用ivar

要回答第二个问题:您正在合成属性名称并将其与名为
\u name
的内部变量(ivar)关联,以便在类内部可以使用ivar
\u name
访问属性的值


我强烈建议您阅读。

以回答第一个问题:
alloc
方法初始化字符串时,您保留创建的对象,但之后不释放对象,因此出现泄漏,使用
stringWithString
创建字符串时,您会得到一个自动释放的对象,该对象由自动释放池自动释放。请注意,在第9行的示例中,您正在初始化对象并将其传递给属性的setter,如果使用ivar

要回答第二个问题:您正在合成属性名称并将其与名为
\u name
的内部变量(ivar)关联,以便在类内部可以使用ivar
\u name
访问属性的值

我强烈建议你阅读这本书

问题1:如果我遵循第7行,一切都很好,如果我使用第9行,内存泄漏是存在的。正如我所知,self指向当前对象,如果我使用self.object或干脆使用object,则没有更多区别

在第7行,您使用的是一个方便的构造函数,它返回一个自动释放的对象,并将该对象直接分配给您的
name
ivar;现在,将自动删除对象指定给保留属性是可以的,但将自动删除对象直接指定给ivar而不显式保留它是不正确的:

Line  7:     name = [NSString stringWithString:@"Hello"];
Line  8:                          OR
Line  9:     self.name = [[NSString alloc]initWithString:@"Hello"]; 
在第9行中,您正在使用alloc/init,它为您提供了一个保留对象:直接将此类对象分配给ivar是正确的,但您应该在分配给保留属性之前自动释放它,例如:

name = [[NSString stringWithString:@"Hello"] retain];
您可以根据对象保留计数对此进行推理:

  • 方便的构造函数会将retain count设置为1,但稍后会通过框架执行的
    release
    调用自动减少该值

  • alloc/init将给您一个retain计数1,除非您显式调用
    release
    ,否则该计数不会减少

  • 当对象保留计数变为0时,它将被释放

  • 从保留计数的角度进行推理只是一种看待整个内存管理问题并理解框架中深层次发生的事情的方式;但是,在任何情况下,这都不是分析对象生命周期的正确方法

    那么,哪一个用于设置name的值,哪一个用于获取该值?
    name=[nsstringwithstring:@“Hello”]之间的差异
    OR
    self.name=[nsstringwithstring:@“Hello”]
    \u name=[NSString stringWithString:@“Hello”]

    在给出的两种情况下,情况完全相同。这将绕过属性setter(/getter)方法并直接分配给ivar。在这种情况下,您的应用程序迟早会崩溃,因为您正在将自动删除的对象直接分配给ivar。这是正确的:

    _name = [NSString stringWithString:@"Hello"];
    

    请注意,在将ivar声明为
    \u name
    的程序中,不能使用
    name
    来引用它;如果您只声明了属性,而没有像问题1那样明确指定ivar,则可以使用
    name
    直接引用ivar(在这种情况下,
    name
    将是编译器为您自动生成的ivar)

    另一方面:

    _name = [[NSString alloc] initWithString:@"Hello"];
    
    将使用属性访问器方法(实际上是setter);由于属性声明为
    retain
    ,因此可以将便利构造函数
    stringWithString:
    返回的自动释放变量指定给它

    问题3:如果我创建了任何属性,那么在我分配的内存中是否需要alloc来显示内存泄漏

    这对我来说不是很清楚

    阅读内存管理基础知识的一个好文件是:以及苹果公司的高级内存管理编程指南

    问题1:如果我遵循第7行,一切都很好,如果我使用第9行,内存泄漏是存在的。正如我所知,self指向当前对象,如果我使用self.object或干脆使用object,则没有更多区别

    在第7行,您使用的是一个方便的构造函数,它返回一个自动释放的对象,并将该对象直接分配给您的
    name
    ivar;现在,将自动删除对象指定给保留属性是可以的,但将自动删除对象直接指定给ivar而不显式保留它是不正确的:
    name = [NSString stringWithString:@"Hello"];
    
    _name = [NSString stringWithString:@"Hello"];
    
    _name = [[NSString stringWithString:@"Hello"] retain];
    
    _name = [[NSString alloc] initWithString:@"Hello"];
    
    self.name = [NSString stringWithString:@"Hello"]; 
    
    Line  7:     name = [NSString stringWithString:@"Hello"];
    Line  8:                          OR
    Line  9:     self.name = [[NSString alloc] initWithString:@"Hello"]; 
    
    Line  7a:     name = [[NSString alloc] initWithString:@"Hello"];
    Line  8a:                          OR
    Line  9b:     self.name = [NSString stringWithString: @"Hello"]; 
    
    @synthesize name = _name;