iOS 开发问与答(142-159)

142. 如何在 Category 中定义简单属性?

通常我们会在类别中用 objc_setAssociatedObject 来定义一个属性。但是 objc_setAssociatedObject 方法定义如下:

void objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy)

它的第三个参数 value 为 id 类型,也就是说,它只能定义对象类型属性。那我们要定义简单类型比如 CGFloat 或 int 属性时怎么办?

假设我们定义一个 CGFloat 属性:

@property(nonatomic,assign)CGFloat rollSpeed

那么我们需要这样合成它的 setter 方法:

- (void)setRollSpeed:(CGFloat)rollSpeed{
    objc_setAssociatedObject(self, @selector(rollSpeed), @(rollSpeed), OBJC_ASSOCIATION_ASSIGN);
}

也就是说这个属性的背后实际上用一个 NSNumber 对象的关联对象存储。这样合成 getter 方法时也要访问这个 NSNumber 对象并转成 double 来获取:

-(CGFloat)rollSpeed{
    NSNumber* number = objc_getAssociatedObject(self, @selector(rollSpeed));
    if(number != nil){
        return number.doubleValue;
    }
    return 0;
}

回到目录

143. 如何查看某段内存地址对应的代码?

在 lldb 中使用:

image lookup --address 0x0000000104c25550

回到目录

144. 如何在变量等于某个字符串时中断程序?

使用条件断点,条件设置为一个 BOOL 表达式。注意判断字符串是否相等不要使用 == ,而是使用 isEqualToString:

[methodName isEqualToString:@"callbackJS:result:"]

注意修改条件后,需要重新运行程序。

回到目录

145. 为什么 setNavigationBarHidden 不生效?

请确认你是在 viewWillAppear/viewDidAppear 中,而不是在 viewDidLoad 中调用 setNavigationBarHidden 。

回到目录

146. 如何截去字符串前后空格?

    NSString *trimmedString = [string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; 

回到目录

147. 为什么 pathForResource 对有的文件会返回 nil?

对于有的文件类型,比如 .m4a、.xml,Xcode 不会将文件自动添加到 bundle。请在 File Inspector 中将这个文件添加到 bundle。

回到目录

148. 如何播放gif动画?

NSArray* gifArray = [NSArray arrayWithObjects:
                [UIImage imageNamed:@"play1"],
                [UIImage imageNamed:@"play2"],
                [UIImage imageNamed:@"play3"],
                [UIImage imageNamed:@"play4"],
                [UIImage imageNamed:@"play5"],
                [UIImage imageNamed:@"play6"],
                [UIImage imageNamed:@"play7"],
                [UIImage imageNamed:@"play8"],
                [UIImage imageNamed:@"play9"],
                [UIImage imageNamed:@"play10"],
                [UIImage imageNamed:@"play11"],
                [UIImage imageNamed:@"play12"],
                [UIImage imageNamed:@"play13"],
                [UIImage imageNamed:@"play14"],
                nil];
    UIImageView* ivWavePeak = [[UIImageView alloc] initWithFrame:self.bounds];

    ivWavePeak.animationImages = gifArray; //动画图片数组
    ivWavePeak.animationDuration = 1.5; //执行一次完整动画所需的时长
    ivWavePeak.animationRepeatCount = 0;  //动画重复次数,无限循环

回到目录

149. 如何等待多个异步操作完成再执行某些动作?

    dispatch_group_t group = dispatch_group_create();

    NSMutableDictionary<NSString*,NSData*>* urls = [NSMutableDictionary new];

    for(PHAsset* photo in assetArray){
        dispatch_group_enter(group);

        [[PHImageManager defaultManager] requestImageForAsset:photo targetSize:PHImageManagerMaximumSize contentMode:PHImageContentModeDefault options:nil resultHandler:^(UIImage *result, NSDictionary *info) {
            NSString* fileurl = info[@"PHImageFileURLKey"];
            NSData* data = UIImageJPEGRepresentation(result,0.99);
            urls[fileurl]= data;
            dispatch_group_leave(group);

        }];


    }
   dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    dispatch_group_notify(group, queue, ^{
        ……
    });

回到目录

150. 为什么 viewDidLoad 方法不调用?

这个 ViewController 有一个 Category,把 viewDidLoad 方法覆盖了,所以调用的是 Category 的 viewDidLoad 方法。

回到目录

151. 为什么当 imagePickerController 解散后页面变成了空白?

假设弹出 imagePickerController 的视图控制器名为 A,当 imagePickerController 显示时,会 retain A(即 presentingViewController),于是 A 的引用计数为 2。由于 imagePickerController 会遮住 A,A 会被 ARC 系统自动释放(因为它不需要显示了),于是引用计数变成了 2-1 = 1。当 imagePickerController 解散时,它会被自动释放,它的 presentingViewController 也会 release,于是 A 的引用计数变成了 0。A 被释放。

因此解决办法就是强引用 imagePickerController 对象,让它不会在方法结束时自动释放。即在 A 的类声明中定义一个 retain 属性引用 imagePickerController 对象。但这会导致引用循环(retain cycle)问题。即 imagePickerController 强引用 A,而 A 又强引用了 imagePickerController。为了避免这个问题,我们需要在解散 imagePickerController 的时候手动 release 它一次:

[self dismissViewControllerAnimated:YES completion:^(){
    self.imagePicker= nil;
}];

回到目录

152. 为什么对 UIView 截图得到模糊的图?

将 UIGraphicsBeginImageContext(size); 一句替换为:

UIGraphicsBeginImageContextWithOptions(shotView.bounds.size, NO, [[UIScreen mainScreen] scale]);

回到目录

为什么毛玻璃效果(UIBlurEffect)在有的设备上不生效?

注意,是有的设备没效果(iOS 8 以上),大部分设备上还是生效的。对于没效果的设备,请确认“辅助功能\增强对比度”中的“降低透明度”开关没有被打开。在代码中,可以用 UIAccessibilityIsReduceTransparencyEnabled 来判断是否生效:

//方法一:系统方法,iOS8及以上可用
    if (!UIAccessibilityIsReduceTransparencyEnabled()) {
        UIBlurEffect *blurEffect = [UIBlurEffect effectWithStyle:UIBlurEffectStyleDark];
        UIVisualEffectView *blurEffectView = [[UIVisualEffectView alloc]initWithEffect:blurEffect];
        blurEffectView.frame = _imageView.bounds;
        [_imageView addSubview:blurEffectView];
    }


    //方法二:Core Image
    UIImageView *blurImageView = [[UIImageView alloc]initWithFrame:_imageView.bounds];
    blurImageView.image = [self blur:[UIImage imageNamed:@"1.jpg"]];
    [_imageView addSubview:blurImageView];

其中,Core Image 生成毛玻璃效果的方法如下:

//生成一张毛玻璃图片
- (UIImage*)blur:(UIImage*)theImage
{
    CIContext *context = [CIContext contextWithOptions:nil];
    CIImage *inputImage = [CIImage imageWithCGImage:theImage.CGImage];

    CIFilter *filter = [CIFilter filterWithName:@"CIGaussianBlur"];
    [filter setValue:inputImage forKey:kCIInputImageKey];
    [filter setValue:[NSNumber numberWithFloat:15.0f] forKey:@"inputRadius"];
    CIImage *result = [filter valueForKey:kCIOutputImageKey];

    CGImageRef cgImage = [context createCGImage:result fromRect:[inputImage extent]];

    UIImage *returnImage = [UIImage imageWithCGImage:cgImage];
    CGImageRelease(cgImage);
    return returnImage;
}

回到目录

为什么 CIDetector 有的图不识别?

原图太大,导致识别率过低。可以压缩一下原图再进行识别:

UIImage* resizeImage = [image scaledToScale:0.2];

    CIImage *ciImage = [[CIImage alloc] initWithCGImage:resizeImage.CGImage options:nil];
    //创建探测器
    CIDetector *detector = [CIDetector detectorOfType:CIDetectorTypeQRCode context:nil options:@{CIDetectorAccuracy: CIDetectorAccuracyHigh}];
    NSArray *feature = [detector featuresInImage:ciImage];

    //取出探测到的数据
    for (CIQRCodeFeature *result in feature) {
        content = result.messageString; // TON131605BBBB050
        [self stringChages:content];
    }

回到目录

155. 为什么用 setNavigationBarHidden: 无法显示导航栏?

请检查是不是在代码中强制将 navigationBar 设置为隐藏了:

self.navigationController.navigationBar.hidden = YES;

将这句代码注释了。不应该直接设置 navigationBar 的 hidden 属性,改用 setNavigationBarHidden 方法隐藏导航栏。
回到目录

156. 访问https出错:In order to validate a domain name for self signed certificates, you MUST use pinning

设置两个安全设置:

securityPolicy.allowInvalidCertificates = YES;
securityPolicy.validatesDomainName = NO;

回到目录

157.我的设备数达到了上限,我又急需要增加新的设备怎么办?

对此你可以给苹果的技术客服发邮件要求他们帮助我们删除所有的设备,并且恢复到增加100个测试设备的名额。具体做法是访问https://developer.apple.com/contact/, 单击“Program Benefits”按钮,然后在新出来的提交页面中将需求添上。之后苹果会发邮件告诉你处理结果,你可能需要打电话过去和他们沟通一些细节。在沟通完成之后,苹果就可以立即帮助你把状态修改到“可删除设备来增加测试设备名额”。这样,你就可以选择性的删除一些不需要的设备来释放一些名额了。
回到目录

158.知道中文字符串对应的 utf8 数值,如何正确输出这段中文?

比如,中文“精品”的 unicode(utf8) 值为“\U7cbe\U54c1”,如何将 \U7cbe\U54c1 正确的中文“精品”输出出来?答案是:NSString => NSData => NSString

    NSString *s = @"\\U7cbe\\U54c1";

    NSData *data=[s dataUsingEncoding:NSUTF8StringEncoding];



    s = [[NSString alloc] initWithData:data encoding:NSNonLossyASCIIStringEncoding] ;
    NSLog(@"%@",s);

注意斜杠“\”在 NSString 中要用两道斜杠“\”来进行转义。

回到目录

159. 如何禁用 CALayer 的隐式动画效果?

当对非Root Layer的部分属性进行修改时,默认会自动产生一些动画效果,而这些属性称为Animatable Properties(可动画属性)。但有时候我们不需要这些隐式动画效果,该怎么关闭它呢?

比如当我们修改一个 CALayer 的 frame 时,默认会有一个框架变形的动画(iOS 10.3)。如果我们不需要这个效果,可以将 CATransaction 的 disableActions 属性设置为 YES:

    [CATransaction begin];
    [CATransaction setDisableActions:YES];
    barMaskLayer.frame = CGRectMake(_leftGap, _topGap, width*_percent, _barHeight);
    [CATransaction commit];

回到目录

【6层】一字型框架办公楼(含建筑结构图、计算书) 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
深度学习是机器学习的一个子领域,它基于人工神经网络的研究,特别是利用多层次的神经网络来进行学习和模式识别。深度学习模型能够学习数据的高层次特征,这些特征对于图像和语音识别、自然语言处理、医学图像分析等应用至关重要。以下是深度学习的一些关键概念和组成部分: 1. **神经网络(Neural Networks)**:深度学习的基础是人工神经网络,它是由多个层组成的网络结构,包括输入层、隐藏层和输出层。每个层由多个神经元组成,神经元之间通过权重连接。 2. **前馈神经网络(Feedforward Neural Networks)**:这是最常见的神经网络类型,信息从输入层流向隐藏层,最终到达输出层。 3. **卷积神经网络(Convolutional Neural Networks, CNNs)**:这种网络特别适合处理具有网格结构的数据,如图像。它们使用卷积层来提取图像的特征。 4. **循环神经网络(Recurrent Neural Networks, RNNs)**:这种网络能够处理序列数据,如时间序列或自然语言,因为它们具有记忆功能,能够捕捉数据中的时间依赖性。 5. **长短期记忆网络(Long Short-Term Memory, LSTM)**:LSTM 是一种特殊的 RNN,它能够学习长期依赖关系,非常适合复杂的序列预测任务。 6. **生成对抗网络(Generative Adversarial Networks, GANs)**:由两个网络组成,一个生成器和一个判别器,它们相互竞争,生成器生成数据,判别器评估数据的真实性。 7. **深度学习框架**:如 TensorFlow、Keras、PyTorch 等,这些框架提供了构建、训练和部署深度学习模型的工具和库。 8. **激活函数(Activation Functions)**:如 ReLU、Sigmoid、Tanh 等,它们在神经网络中用于添加非线性,使得网络能够学习复杂的函数。 9. **损失函数(Loss Functions)**:用于评估模型的预测与真实值之间的差异,常见的损失函数包括均方误差(MSE)、交叉熵(Cross-Entropy)等。 10. **优化算法(Optimization Algorithms)**:如梯度下降(Gradient Descent)、随机梯度下降(SGD)、Adam 等,用于更新网络权重,以最小化损失函数。 11. **正则化(Regularization)**:技术如 Dropout、L1/L2 正则化等,用于防止模型过拟合。 12. **迁移学习(Transfer Learning)**:利用在一个任务上训练好的模型来提高另一个相关任务的性能。 深度学习在许多领域都取得了显著的成就,但它也面临着一些挑战,如对大量数据的依赖、模型的解释性差、计算资源消耗大等。研究人员正在不断探索新的方法来解决这些问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值