Ios Objective-C中的性质
问题1: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
如果我遵循第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];
您可以根据对象保留计数对此进行推理:
release
调用自动减少该值release
,否则该计数不会减少name=[nsstringwithstring:@“Hello”]之间的差异
ORself.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;