内存管理实践指南
立即解锁
发布时间: 2025-08-21 01:59:24 阅读量: 2 订阅数: 9 

### 内存管理全解析:从基础到自定义类的实践
#### 1. 不使用 ARC 搭建应用
在开发应用时,有时我们希望不借助自动引用计数(ARC)来管理内存。以下是具体的操作步骤:
- **创建项目时的设置**:当你在 Xcode 中创建新项目时,会看到一个名为“Choose options for your new project”的界面。其中有一个复选框,上面写着“Use Automatic Reference Counting”,确保不勾选这个选项。这种设置适用于 Mac 应用、Mac 命令行应用以及任何 iOS 应用。为了后续示例的一致性,我们以 iOS 应用为例。
- **原理说明**:Xcode 会根据你提供的设置来搭建项目。当你在选项界面中选择不使用 ARC 时,Xcode 会记住使用不启用 ARC 的编译器设置来编译项目。同时,Xcode 允许你发送用于内存管理的特定消息,包括 `retain`、`release`、`autorelease` 和 `dealloc`。如果在 ARC 项目中尝试使用这些消息,会出现编译器错误,但在非 ARC 项目中,你可以使用这些消息来实现引用计数系统。例如,查看 `AppDelegate.m` 文件,你会看到 Xcode 自动为你编写的 `dealloc` 方法示例,其中包含了一些内存管理代码。
以下是相关代码示例:
```objc
// Listing 8-1. main.m
#import <UIKit/UIKit.h>
#import "AppDelegate.h"
int main(int argc, char *argv[]){
@autoreleasepool {
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}
}
// Listing 8-2. AppDelegate.h
#import <UIKit/UIKit.h>
@interface AppDelegate : UIResponder <UIApplicationDelegate>
@property (strong, nonatomic) UIWindow *window;
@end
// Listing 8-3. AppDelegate.m
#import "AppDelegate.h"
@implementation AppDelegate
@synthesize window = _window;
- (void)dealloc{
[window release];
[super dealloc];
}
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{
self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
self.window.backgroundColor = [UIColor whiteColor];
[self.window makeKeyAndVisible];
return YES;
}
@end
```
#### 2. 使用引用计数管理内存
当在应用中使用对象时,确保对象的内存得到有效管理至关重要。下面介绍具体方法:
- **对象创建与释放规则**:当使用 `alloc`、`new` 或 `copy` 消息创建对象时,构造代码所在的实体将拥有该对象,并且对象的引用计数会被设置为 1。当不再需要该对象时,所有者有责任向对象发送 `release` 消息。
- **示例代码及原理**:
```objc
NSObject *obj = [[NSObject alloc] init];
NSLog(@"obj's description is %@", [obj description]);
[obj release];
```
在上述代码中,第一行使用 `alloc` 创建了一个引用计数为 1 的 `NSObject` 对象。在使用该对象向日志输出消息时,引用计数仍然为 1。当发送 `release` 消息后,对象的引用计数变为 0,Objective-C 会自动销毁该对象。这体现了一个重要的内存管理规则:始终将 `alloc`、`new` 和 `copy` 与 `release` 消息匹配。
除了基本的创建和释放操作,还可以通过发送 `retain` 消息来增加对象的引用计数。`reta
0
0
复制全文
相关推荐








