1

我需要弄清楚 Objective-C 内存管理:

如果我在类头中将一个对象声明为没有@property 的 ivar:

 @interface MyFacebooDelegate : UIViewController 
 {
     TableViewController *tableController;
 }
 ...
 @end

以及代码中的一些地方,例如- (void)viewDidLoad我做的:

tableController = [[TableViewController alloc] init];

所以最好的方法是在哪里释放它。如果我将即时对象设为属性,会有什么不同?以及内存管理将如何

@interface MyFacebooDelegate : UIViewController 
 {
     TableViewController *tableController;
 }
 ...
 @end
@property (nonatomic, strong) TableViewController *tableController;

以下语法对对象 viewController 的作用:

。H

 @interface AppDelegate : UIResponder <UIApplicationDelegate>
 @property (strong, nonatomic) ViewController *viewController;
 @end 

.m

@implementation AppDelegate

@synthesize window = _window;
@synthesize viewController = _viewController;

- (void)dealloc
{
  [_window release];
  [_viewController release];
  [super dealloc];
}
.....
@end

如果我想通过一个方法将一个对象返回给另一个类,我是否需要先autorelease在方法体中,然后retain在接收方?例如,这个方法在方法体和接收方到底要做什么:

-(NSString *)getFriendId
 {
NSArray *ar = [NSArray arrayWithObjects:@"1",@"2",@"3", nil];
return [ar objectAtIndex:0];
 }

我知道很多,但我真的很困惑,需要你的帮助。

4

2 回答 2

2

1)最好的方法是在dealloc;或在重新设置之前。

2)财产为您保留/释放。但是警告!你总是把事情搞混。您在这里使用与 ARC 相关的“强”。如果您真的坚持使用经典的保留/释放(您不应该),那么请改用(非原子,保留)。

3) 你的属性在 dealloc 上被释放。再次强调,这里的强是错误的。

4) 是的。理想情况下你应该。ARC 很棒的另一个原因是,它会自动为您完成这一切。

tl;博士:使用 ARC。永远不要回去。(不过还是要学手动内存管理)

于 2012-07-16T14:40:14.053 回答
1

ARC 是您所有内存管理问题的答案。除了 , 关于强和弱属性的非常重要的说明

iOS Strong 属性:So strong 与 ARC 之前的属性声明中的 retain 相同。对于 ARC 项目,我会使用 strong 而不是 retain,我会使用 assign 来表示 C 原始属性。

iOS 出口应定义为声明的属性。出口通常应该是弱的,除了从文件所有者到 nib 文件中的顶级对象(或者,在 iOS 中,故事板场景)应该是强的。因此,默认情况下,您创建的 Outlets 通常是弱的,因为: 您创建的 Outlets,例如,视图控制器的视图或窗口控制器的窗口的子视图,是不暗示所有权的对象之间的任意引用。

于 2012-07-16T14:57:39.563 回答