关于以下课程,我几乎没有问题
#import <Cocoa/Cocoa.h>
@interface SomeObject {
NSString *title;
}
@property (retain) NSString *title;
@end
implementation SomeObject
@synthesize title;
-(id)init {
if (self=[super init])
{
self.title=[NSString stringWithFormat:@"allyouneed"];
}
return self;
}
-(void)testMethod{
self.title=[[NSString alloc] init] ;
}
-(void)dealloc {
self.title=nil;
[super dealloc];
}
2.我是否需要在init和testMethod中自动释放对标题的赋值。如果是,为什么?
有人可以向我解释这些事情。
答案 0 :(得分:2)
1- 您无需在标头中声明iVar。您也可以使用
@synthesize myVar = _myVar;
如果你想使用不同的iVar名称
2- 声明属性“保留”意味着每次为属性分配新对象时,它会自动释放前一个对象并保留新对象。
因此,如果您使用像stringwithFormat这样的便捷方法,该属性将为您保留该对象。
如果你想使用alloc-init,对我来说最好的方法是:
NSString *str = [NSString alloc] init];
self.title = str;
[str release];
此外,将nil分配给dealloc中的属性是正确的,因为该属性将释放它拥有的对象,并且它调用retain on nil,它不执行任何操作
答案 1 :(得分:0)
1.无需在.h中声明标题,声明属性就足够了。
2.当您在init中使用self.title时,您不必自动释放它。但是当您在testMethod中初始化它时,您需要自动释放它,因为您已将该属性声明为retain。并且不要忘记在dealloc中发布标题。
答案 2 :(得分:0)
你不需要自动添加(因为我猜Xcode 4)。
- 你没有,因为它已经返回autoreleased
个对象..
,因为你需要分配它所需的testMethod
...
您始终必须使用alloc
,copy
或new
释放您创建的任何对象.... AMEN ..:)
答案 3 :(得分:0)
请注意,在初始化方法和dealloc方法中使用访问器方法并不是一个好习惯。请查看此答案:Why shouldn't I use Objective C 2.0 accessors in init/dealloc?
同样在Apple的内存管理指南中:https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmPractical.html