OC 断言NSAssert

本文详细解析了Objective-C中一个初始化方法的实现细节,包括参数检查、对象初始化流程及随机数生成等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

-(id)initWithEntryDate:(NSDate *)theDate{

    NSAssert(theDate!=nil, @"Argument must be non -nil");//当theDate=nil抛出异常

    self = [super init];

    if (self) {

        entryDate = theDate;

        firstNumber = random()%100+1;

        secondNumber = random()&100+1;

    }

    return  self;

}

<think>好的,我现在需要将用户提供的Swift代码转换为Objective-C代码。首先,我需要仔细阅读并理解原始的Swift代码,然后逐部分进行转换,同时确保Objective-C的语法和习惯用法正确。 用户的问题是关于在iOS的ViewController中同时处理按钮点击事件和touchesBegan方法的。在Swift代码中,用户创建了一个UIButton,并为其添加了点击事件,同时重写了touchesBegan方法,判断触摸点是否在按钮的范围内,如果在则不处理,否则响应触摸事件。 首先,我需要回顾Objective-C中类似的结构。ViewController在Objective-C中通常是继承自UIViewController的类。创建按钮的过程与Swift类似,但语法不同。例如,alloc init方法,设置frame,添加target动作等。 在Swift中,按钮的点击事件使用@objc func buttonTapped(),而在Objective-C中需要使用对应的IBAction方法,或者使用addTarget:action:forControlEvents:方法,并指定一个方法选择器。 接下来是touchesBegan方法的转换。Objective-C中的方法签名是-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event。需要确保正确获取触摸点,并判断是否在按钮的frame内。 需要注意的是,在Objective-C中,属性的访问需要使用self.或者下划线语法,取决于是否合成属性。此外,按钮的frame可能需要通过self.myButton.frame来访问,或者在实例变量直接访问的情况下使用_myButton.frame。 另外,检查按钮的isUserInteractionEnabled属性是否正确设置为YES,以及视图层级是否正确,确保按钮在最前面,这些在Objective-C中的处理方式与Swift类似,但语法不同。 在转换过程中,可能还需要处理一些类型转换,例如从NSSet中获取UITouch对象,以及将触摸点坐标转换为视图的坐标系。 最后,需要确保转换后的代码能够正确编译,并且功能与原始Swift代码一致,即点击按钮时触发按钮的点击事件,点击其他区域触发touchesBegan方法,并且两者互不干扰。 现在,我需要将上述思考过程转化为具体的Objective-C代码,并添加必要的注释,确保用户能够理解每一步的操作和注意事项。</think>### Objective-C 实现版本 ```objective-c #import "ViewController.h" @interface ViewController () @property (nonatomic, strong) UIButton *myButton; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // 1. 创建并配置按钮 _myButton = [UIButton buttonWithType:UIButtonTypeSystem]; _myButton.frame = CGRectMake(100, 100, 200, 50); [_myButton setTitle:@"点击我" forState:UIControlStateNormal]; [_myButton addTarget:self action:@selector(buttonTapped) forControlEvents:UIControlEventTouchUpInside]; [self.view addSubview:_myButton]; } // 2. 按钮点击事件 - (void)buttonTapped { NSLog(@"按钮被点击 ✅"); } // 3. 触摸事件处理 - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event { UITouch *touch = [touches anyObject]; CGPoint touchPoint = [touch locationInView:self.view]; // 判断是否点击在按钮范围内 if (CGRectContainsPoint(self.myButton.frame, touchPoint)) { return; } NSLog(@"空白区域被点击 ⭕️"); } @end ``` --- ### 🔑 关键差异说明(Swift vs Objective-C) | 特性 | Swift | Objective-C | |--------------------|--------------------------------|---------------------------------| | **按钮创建** | `UIButton(type: .system)` | `[UIButton buttonWithType:UIButtonTypeSystem]` | | **方法语法** | `func` 声明 | `- (void)` 声明 | | **选择器调用** | `#selector(buttonTapped)` | `@selector(buttonTapped)` | | **日志输出** | `print()` | `NSLog()` | | **属性访问** | 直接使用 `myButton` | 使用 `self.myButton` 或 `_myButton` | | **坐标判断** | `frame.contains(point)` | `CGRectContainsPoint(rect, point)` | --- ### 📝 补充说明 1. **内存管理注意**: ```objective-c // 在dealloc中移除观察者(如有需要) - (void)dealloc { [_myButton removeTarget:nil action:NULL forControlEvents:UIControlEventAllEvents]; } ``` 2. **现代语法优化**(使用类型推断): ```objective-c // 使用__kindof修饰符(Xcode 7+) @property (nonatomic, strong) __kindof UIButton *myButton; ``` 3. **安全判断增强**: ```objective-c - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event { if (touches.count == 0) return; UITouch *touch = [touches anyObject]; if (touch.view == self.myButton) return; // 直接判断触摸视图 // 其他处理... } ``` --- ### 🚨 常见问题排查 1. **按钮无响应**: ```objective-c // 检查项: NSAssert(_myButton.superview != nil, @"按钮必须已添加到视图层级"); NSAssert(_myButton.userInteractionEnabled == YES, @"交互必须启用"); ``` 2. **坐标判断异常**: ```objective-c // 转换坐标系(当使用AutoLayout时) CGPoint buttonPoint = [touch locationInView:self.myButton]; if (CGRectContainsPoint(CGRectMake(0, 0, self.myButton.bounds.size.width, self.myButton.bounds.size.height), buttonPoint)) { // 在按钮范围内 } ``` --- ### 🌟 进阶技巧:响应链控制 ```objective-c // 自定义按钮阻止事件传递(默认不需要) @implementation MyButton - (void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event { [super touchesEnded:touches withEvent:event]; // 不调用父级处理方法 } @end ``` 这个Objective-C实现版本完整保留了Swift版本的核心逻辑,同时遵循了Objective-C的编码规范。建议使用Xcode 11+版本进行编译测试。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值